文字列は配列にありますか?


107

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;
}

回答:


210

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

using System.Linq;

//...

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

何らかの理由で最初にメソッドを探したとき、それを見つけることができませんでした...ありがとう。
ブラッド

4
@Brad:それはEnumerableからの拡張メソッドだからです。
AnthonyWJones 2009

8
ワンライナーとして:(new string[] { "foo", "bar" }).Contains("foo")
デニスV

8
さらに短く:new[] { "foo", "bar" }.Contains(foo)
Eric Bole-Feysot 2017年

25

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

これを行う方法の詳細については、私のブログ投稿を参照してください。ただし、主な考え方は次のとおりです。

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

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メソッドを作成する限り)どのタイプでも機能します。確かに任意の値タイプ。


このような var xxx = csvData.Rows[0].ItemArray[0].IsIn(".00", "0.0", ".25", "0.5", ".5", ".50", ".75");ことをしたいのは、最初の列のwhoデータテーブルを調べて、値が次の文字列のいずれでも終わらないかどうかを確認することです。それらが終わらない場合は、そのことを示す文字列を返します.00たとえば、例を使用して値が欠落しているこれを機能させることができないようです。ブール値を返したくないので少しトリッキーです。文字列を返すようにメソッドを変更しましたが、それでも提案は機能しません
MethodMan

これはサイト上の質問として提起された方がいいようです。必要に応じて、この回答を参照してください。
Gabriel McAdams

実際に、私がやりたいことを実行する素晴らしい方法を思いつくことができました。DatatablesItemArrayのforループ内の文字列の値が、次の値のいずれかで終わっているかどうかをチェックするものを書きました文字列 public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
MethodMan

12

Array.Exists関数(または.NET 3.5を使用している場合は少し拡張されたものである場合はContains拡張メソッド)の直後です。


3
.NET 2.0の実用的な例を次に示します。if(Array.Exists(arrayToLookThrough、o => o == elementToSearchFor))
燃料供給された

7

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));


2

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

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

配列がせいぜい200アイテムである場合でも、これらの検索を多数実行すると、Dictionaryはおそらく高速になります。


1
バイナリ検索はO(log n); 辞書はO(1)のサブテンドですが、オーバーヘッドがたくさんあります。小規模から中規模の場合、線形検索またはバイナリ検索の方が優れています。
Marc Gravell

1

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


Findメソッドは、アルゴリズム的には「ループスルー」メソッドと同じです。追加の費用は、何らかのオブジェクトの作成と、おそらく1層または2層の間接参照になりますが、可読性を犠牲にしてそれらを最適化することを心配している場合は、間違っていることを心配しています。
AwesomeTown 2009

1

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

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

効率がよくわからない... Dave


0

これは、アレイを手動で反復するよりも高速です。

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

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

LINQを使用すると、例で行ったように文字列を反復処理するよりも高速になります。strArray.Contains(key)が本当に必要なすべてです
Chris Ballance

3
舞台裏では、とにかくstrArray.Contains(key)が配列をループするだけです... O(n)検索を実行する魔法を使う必要はありません。
AwesomeTown 2009

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.