4

同じアイテムを何度も比較する条件を書く必要があるとき、私はいつも面倒だと思っていました。

string x = textBox1.Text;

if (x == "apple" || x == "orange" || x == "banana" ...)
...

私はこのようなものが欲しいです(もちろん、これは正しい構文ではありません):

if (x == "apple" || "orange" || "banana" ...)

文字列の配列を使用する以外の解決策はありますか?

4

10 に答える 10

10

あなたの条件は、次のように述べています。定義済みの値のいずれかに一致する場合、私は真です。言い換えれば、私が意味的にContainsメソッドである事前定義されたセットの要素である場合:

if (new [] { "apple", "orange", "banana" }.Contains(x))
{

}

配列を使用すると、将来の柔軟性が大幅に向上します。抽出、再利用、保存、キャッシュなどを行うことができます。2 つ以上の既知の値を処理する必要がある場合は、常に「配列とループ」を使用します。

注: Scott Chamberlain がコメントで指摘したように、 using を使用HashSet<T>.Containsするとパフォーマンスが大幅に向上します。

var values = new HashSet<string> { "apple", "banana", "orange" };
if (values.Contains(x))
{

}
于 2012-07-24T19:33:17.673 に答える
7

拡張メソッドはどうですか?

public static class Extensions
{
   public static bool IsOneOf<T>(this T input, params T[] possibilites)
   {
      bool result = possibilites.Contains(input);
      return result;
   }
}

次に、コードを次のように書き直すことができます。

string input = textBox1.Text;
if(input.IsOneOf("apple", "orange", "banana"))
{
    // ....
}
于 2012-07-24T19:38:37.763 に答える
1

(パフォーマンスの観点から)最善の策は、HashSetを使用することです。

    static HashSet<string> Fruits = new HashSet<string> {"apple", "banana", "orange"};

    string x = textBox1.Text;
    if( Fruits.Contains( x)) {

if条件で3つ程度の可能性を超えると、HashSetは直接比較よりも高速に実行されます。

于 2012-07-24T19:52:55.260 に答える
1

複製されたコードをメソッドに移動できます。これにより、このコードが複製された理由も説明されます。これは、何かが実を結んでいるかどうかを検証するためです。これにより、コードの可読性と保守性が向上します。また、このロジックをリファクタリングすることもできます(たとえば、switchステートメントに変換する)。

private bool IsFruit(string name)
{
   switch(name)
   {
       case "apple":
       case "orange":
       ...
       case "banana":
           return true;
       default:
           return false;
   }
}

使用法:

string x = textBox1.Text;
if(IsFruit(x))
   ...

更新:そのような複雑な条件を使用しない方が良いです-時々理解するのは本当に難しいです。Introduce ExplainingVariableまたはExtractMethod(上記のように)リファクタリングを使用して、コードをより明確にすることができます。

于 2012-07-24T19:34:11.620 に答える
0

switchステートメントを使用できます。

switch(x)
{
    case "apple":
    case "orange":
    case "banana":
        // "if" code goes here
        break;
    default:
        // "else" code goes here
        break;
}
于 2012-07-24T19:33:41.447 に答える
0

私は拡張メソッドのソリューションが好きで、以前に使用したことがあります。「CommonUtils」ライブラリで使用できるメソッドは次のとおりです。

    public static bool IsIn<T>(this T toFind, IEnumerable<T> collection)
    {
        return collection.Contains(toFind);
    }

    public static bool IsIn<T>(this T toFind, ICollection<T> collection)
    {
        return collection.Contains(toFind);
    }

    public static bool IsIn<T>(this T toFind, params T[] items)
    {
        return toFind.IsIn(items.AsEnumerable());
    }

これら 3 つの間で、ほぼすべてのコレクションを使用でき、項目をパラメーター リストとして指定することもできます。

于 2012-07-24T21:09:11.507 に答える
0

リンクソリューション

var strarray = new string[]
        {
            "apple",
            "orange",
            "banana"
        };

bool a = strarray.Any( x=> x ==  textBox1.Text);
if(a)
 //CODE 
else 
 //code

このようなスイッチケースを試してください

Switch(value)
{
  case "apple":
  case "orange":
  case "banana":....
    //code you want
  break;
}
于 2012-07-24T19:32:57.920 に答える
0

switch ステートメントを like so で使用する

switch (x)
{
   case "apple":
   case "orange":
   case "banana":
      //code
      break;
}
于 2012-07-24T19:33:04.143 に答える
0

switch ステートメントを試すことができます。

switch (x)
{
    case "apple":
    case "orange":
    case "banana":
        //...
        break;
}
于 2012-07-24T19:33:06.080 に答える
-2

次のようなことができます。

string it = "apple,orange,banana";

if(it.Contains(x))
{
  //do work
}

さらに簡単:

if("apple,orange,banana".Contains(x))
    {
      //do work
    }
于 2012-07-24T19:35:44.740 に答える