2

さまざまなオプションをパラメーターとしてメソッドに渡す方法を探しています。ユーザーが 6 つのオプションのいずれかまたはすべて、またはそれらのサブセットを選択できるとします。したがって、彼はすべてのオプション、オプション 1、2、および 4 のみ、オプション 1、3、5、および 6 のみを選択できます...

これを効果的に渡すにはどうすればよいですか?

ビット単位の加算ができるので、列挙型を使用することを考えていましたが、そこから次のパズルのピースが欠けています。

私の方法は次のようになりますか?

public void Foo(byte selectedOptions)
{
   // How do I check whether an option has been selected??
   if (selectedOptions >= Option.Whatever) DoThis();
}

ですから、私はビット単位の比較に固執していて、これが正しい方法なのだろうか...

私がしたくないことは次のとおりです。

public void Foo(bool option1Selected, bool option2Selected, etc...);

アイデア?

4

5 に答える 5

6

列挙型フラグを使用する

[Flags]
public enum FlagTest
{
    None = 0x0,
    Flag1 = 0x1,
    Flag2 = 0x2,
    Flag3 = 0x4
}

複数のオプションを選択するには、ビット単位または

FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2;

フラグが選択されているかどうかを確認するには、ビット単位で使用し、

if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
     // Do something
}
于 2012-06-21T10:03:28.010 に答える
1

ユーザー パラメータ キーワード:

public void Foo(params string[] options);

次に、無制限の文字列パラメーターを関数に渡し、それらを string[] 配列で読み取ることができます。

または列挙型を使用します(これは私見の方が良い方法です):

[Flags]
public enum MyEnum {
    Value1 = 1,
    Value2 = 2,
    Value3 = 4,
    Value4 = 8,
    Value5 = 16,
    Value6 = 32,
}
public void Foo(MyEnum value){
    if (value & MyEnum.Value1 > 0){
        // we have Value1 passed
    }
}

これを次のように呼び出します。

Foo(MyEnum.Value1 | MyEnum.Value4 | MyEnum.Value10);

列挙値は、1、2、3、4、5 のように連続してはいけませんが、フラグ値は 2^x です。

于 2012-06-21T10:01:41.927 に答える
0

HashSet<YourEnum>一連のオプションを保持するために使用できます。

public void Foo(HashSet<YourEnum> selectedOptions)
{
    if(selectedOptions.Contains(YourEnum.Option1))
        DoSomething();
}

ちょうど使用するenumことは問題ありませんが、私にとってContains()は、メソッドはオプションをテストするためのより読みやすい方法です。

于 2012-06-21T10:06:41.347 に答える
0

あなたはあなたの旗をANDしたい

public void Foo(Option selectedOptions) 
{
  if ((selectedOptions & Option.Whatever)>0) 
  {
     // whatever
  }
}

また、列挙型を次のように装飾する必要があります[Flags]

例えば:

[Flags]
public enum Option
于 2012-06-21T10:02:45.170 に答える
0

伝統的に、あなたが説明していることを達成するにはいくつかの方法がありました。最初は構造体を定義することです:

public class FooOptions
{
    bool Fizz;
    bool Buzz;
    bool Boom;
}

...そして、メソッドの呼び出し元は、適切なフィールドがtrueに設定されたインスタンスを渡します。

フラグ列挙型は別の解決策でした:

public enum FooOptions
{
    Fizz = 1,
    Buzz = 2,
    Boom = 4,
}

...次に、次のようなものを使用してテストします。

if ((options & FooOptions.Fizz) == FooOptions.Fizz) { ... }

ただし、最近では、C# にはオプションの名前付きパラメーターがあります。これは、最終的なアプローチ (やりたくないアプローチ) が最も賢明であることを意味します。

public void Foo(bool fizz = false, bool buzz = false, bool boom = false)
{
    ...
}

...次のようなパラメーターの任意の順列で呼び出すことができます。

Foo(fizz: true, boom: true);
Foo(buzz: true);
于 2012-06-21T10:04:51.527 に答える