web-dev-qa-db-ja.com

文字列は配列ですか?

string[]を調べて要素が含まれているかどうかを確認する最良の方法は何でしょうか。これが私の最初のショットでした。しかし、おそらく私が見落としているものがあります。配列サイズは200要素以下です。

bool isStringInArray(string[] strArray, string key)
{
    for (int i = 0; i <= strArray.Length - 1; i++)
        if (strArray[i] == key)
            return true;
    return false;
}
97
Brad

既に組み込まれているContains()メソッドを使用するだけです:

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}
192
Dave Markle

これは古いことは知っていますが、ジェネリックメソッドと拡張メソッドを使用してこれを行う新しいメソッドがあることを新しい読者に知ってもらいたいと思いました。

ブログ投稿 を読んで、これを行う方法の詳細を確認できますが、主なアイデアは次のとおりです。

この拡張メソッドをコードに追加することにより:

public static bool IsIn<T>(this T source, params T[] values)
{
    return values.Contains(source);
}

次のように検索を実行できます。

string myStr = "str3"; 
bool found = myStr.IsIn("str1", "str2", "str3", "str4");

どのタイプでも機能します(適切なequalsメソッドを作成する限り)。確かに任意の値タイプ。

24
Gabriel McAdams

Array.Exists関数(または.NET 3.5を使用している場合は、Contains拡張メソッドを使用する方が便利です)。

12
Noldorin

配列はソートされていますか?その場合は、 バイナリ検索 を実行できます。 。NET実装も同様です 配列が並べ替えられている場合、バイナリ検索により、反復ソリューションよりもパフォーマンスが向上します。

6
Andrew Hare

Linq(s&gの場合):

var test = "This is the string I'm looking for";
var found = strArray.Any(x=>x == test);

または、要件に応じて

var found = strArray.Any(
    x=>x.Equals(test, StringComparison.OrdinalIgnoreCase));
6
Will

一般に、配列は、特定のオブジェクトがコレクション内にあるかどうかを確認する場合に使用するには不十分なデータ構造です。

この検索を頻繁に実行する場合、配列ではなくDictionary<string, something>を使用する価値があるかもしれません。ディクショナリ内のルックアップはO(1)(定数時間)であり、配列全体の検索はO(N)(配列の長さに比例して時間がかかります)です。

配列がせいぜい200項目しかない場合でも、これらの検索を多数行うと、辞書はおそらく高速になります。

2
Zack Elan

上記のスレッドで何度も述べたように、使用中のフレームワークに依存します。 .Net Framework 3以降には、配列用の.Contains()またはExists()メソッドがあります。以下の他のフレームワークでは、配列をループする代わりに次のトリックを行うことができます...

((IList<string>)"Your String Array Here").Contains("Your Search String Here")

効率についてはあまりよくわかりません...デイブ

1
Dave

LINQを使用して配列を反復処理することもできます。または、デリゲートを検索するFindメソッドを使用できます。ただし、findメソッドはループするよりも少し高価だと思います。

1
masfenix

Linqを使用したくない、または単にLinqを使用できない場合は、静的Array.Exists(...);関数も使用できます。

https://msdn.Microsoft.com/en-us/library/yw84x8be%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

var arr = new string[]{"bird","foo","cat","dog"};

var catInside = Array.Exists( 
  arr, // your Array
  (s)=>{ return s == "cat"; } // the Predicate
);

述部がtrueを返すと、catInsideもtrueになります。

0
mateiasu

これは、配列を手動で繰り返すよりも高速です。

static bool isStringInArray(string[] strArray, string key)
    {

        if (strArray.Contains(key))
            return true;
        return false;
    }
0
Chris Ballance