4

そこで、次のステートメントを使用して、文字列に配列の特定の単語が含まれているかどうかを確認します。

if(stringArray.Any(s => stringToCheck.Contains(s)))

単純。これで一致が見つかり、ステートメントは真です。しかし、配列内のどの項目が文字列と一致したかも知りたいです。上記のLINQステートメントのプレースホルダー「s」は、次の句では使用できません。

誰かがアイデアを持っていることを願っています。はい、配列をループすることもできますが、LINQの方がはるかに見栄えがします。=)

4

4 に答える 4

6
var match = stringArray.FirstOrDefault(s => stringToCheck.Contains(s));
if(match != null) {
    // match was found
}
于 2012-12-03T08:11:01.893 に答える
3

入力リスト内のすべての文字列を条件に一致させる場合は、次を使用する必要がありますWhere

var matchingStrings = stringArray.Where(s => stringToCheck.Contains(s))

最初の文字列だけが必要な場合は、次を使用できます FirstOrDefault

var firstMatchingString = stringArray
    .FirstOrDefault(s => stringToCheck.Contains(s))

使用可能なすべての方法の概要については、http://msdn.microsoft.com/en-us/library/bb341635.aspxを確認してください。

Linq to Objectsの概要については、ここで101のサンプルを確認してください:http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

于 2012-12-03T08:11:20.940 に答える
1

もう1つの簡単な解決策(1行のコードのみ)は、Selectオーバーロードを利用することです。

selectを使用すると、value および indexコンテンポラリーにアクセスできます。

//Example:
string[] arr = new[] {"a", "bb", "ccc"}; 
var result = arr.Select((v,i)=>new {value=v, index=i}).Where(x=>x.value.Contains("c"));

これにより、次のような結果が生成されます。

{"ccc", 2}
于 2012-12-03T08:18:44.057 に答える
1

別の(より効率的な)アプローチはEnumerable.Join次のとおりです。

IEnumerable<string> matches = from str1 in stringArray
                              join str2 in stringToCheck on str1 equals str2
                              select str1;
if(matches.Any())
{
    string allMatches = string.Join(", ", matches);
    Console.Write(allMatches);
}

LINQ JOINがWHEREとのリンクよりもはるかに高速なのはなぜですか?

または多分さらに効率的に使用してEnumerable.Intersect

IEnumerable<string> matches = stringArray.Intersect(stringToCheck);
foreach(string common in matches)
{
    // ...
}
于 2012-12-03T08:19:26.200 に答える