同じアイテムを何度も比較する条件を書く必要があるとき、私はいつも面倒だと思っていました。
string x = textBox1.Text;
if (x == "apple" || x == "orange" || x == "banana" ...)
...
私はこのようなものが欲しいです(もちろん、これは正しい構文ではありません):
if (x == "apple" || "orange" || "banana" ...)
文字列の配列を使用する以外の解決策はありますか?
同じアイテムを何度も比較する条件を書く必要があるとき、私はいつも面倒だと思っていました。
string x = textBox1.Text;
if (x == "apple" || x == "orange" || x == "banana" ...)
...
私はこのようなものが欲しいです(もちろん、これは正しい構文ではありません):
if (x == "apple" || "orange" || "banana" ...)
文字列の配列を使用する以外の解決策はありますか?
あなたの条件は、次のように述べています。定義済みの値のいずれかに一致する場合、私は真です。言い換えれば、私が意味的に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))
{
}
拡張メソッドはどうですか?
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"))
{
// ....
}
(パフォーマンスの観点から)最善の策は、HashSetを使用することです。
static HashSet<string> Fruits = new HashSet<string> {"apple", "banana", "orange"};
string x = textBox1.Text;
if( Fruits.Contains( x)) {
if条件で3つ程度の可能性を超えると、HashSetは直接比較よりも高速に実行されます。
複製されたコードをメソッドに移動できます。これにより、このコードが複製された理由も説明されます。これは、何かが実を結んでいるかどうかを検証するためです。これにより、コードの可読性と保守性が向上します。また、このロジックをリファクタリングすることもできます(たとえば、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(上記のように)リファクタリングを使用して、コードをより明確にすることができます。
switchステートメントを使用できます。
switch(x)
{
case "apple":
case "orange":
case "banana":
// "if" code goes here
break;
default:
// "else" code goes here
break;
}
私は拡張メソッドのソリューションが好きで、以前に使用したことがあります。「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 つの間で、ほぼすべてのコレクションを使用でき、項目をパラメーター リストとして指定することもできます。
リンクソリューション
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;
}
switch ステートメントを like so で使用する
switch (x)
{
case "apple":
case "orange":
case "banana":
//code
break;
}
switch ステートメントを試すことができます。
switch (x)
{
case "apple":
case "orange":
case "banana":
//...
break;
}
次のようなことができます。
string it = "apple,orange,banana";
if(it.Contains(x))
{
//do work
}
さらに簡単:
if("apple,orange,banana".Contains(x))
{
//do work
}