web-dev-qa-db-ja.com

C#文字列に文字列配列に一致するものが含まれているかどうかを確認します

文字列にC#の文字列配列に一致するものが含まれているかどうかを確認する最も速い方法は何でしょうか?ループを使ってそれを行うことはできますが、それは遅すぎると思います。

11
rayanisran

文字列を正規表現またはステートメントと組み合わせて、「1回のパスで実行」することもできますが、技術的には、正規表現は内部でループを実行します。最終的には、ループが必要です。

4
Brent Arias

LINQの使用:

 return array.Any(s => s.Equals(myString))

確かに、文化や事例を考慮に入れたいと思うかもしれませんが、それが一般的な考え方です。また、平等が「一致」の意味ではない場合は、いつでも「一致」に使用する必要のある関数を使用できます。

23
Esteban Araya

これが絶対に最速の方法であるかどうかは本当にわかりませんが、私が一般的に行っている方法の1つは次のとおりです。

これにより、文字列に配列の文字列が含まれているかどうかがチェックされます。

string[] myStrings = { "a", "b", "c" };
string checkThis = "abc";

if (myStrings.Any(checkThis.Contains))
{
    MessageBox.Show("checkThis contains a string from string array myStrings.");
}

文字列に配列のすべての文字列(要素)が含まれているかどうかを確認するには、ifステートメントのmyStrings.AnymyStrings.Allに変更するだけです。

これがどのようなアプリケーションかはわかりませんが、よく使用する必要があります。

if (myStrings.Any(checkThis.ToLowerInvariant().Contains))

したがって、ユーザー入力を確認する場合は、ユーザーが文字列を大文字で入力するかどうかは関係ありません。これは、ToLowerInvariant()を使用して簡単に元に戻すことができます。

これがお役に立てば幸いです。

12

それは私にとってはうまくいきます:

string[] characters = new string[] { ".", ",", "'" };
bool contains = characters.Any(c => Word.Contains(c));
7
David

「配列」が決して変更されない(または変更される頻度が低い)場合で、それに対してテストする入力文字列が多数ある場合は、配列からHashSet<string>を作成できます。 HashSet<T>.Containsは、O(N)であるループとは対照的に、O(1)操作です。

ただし、HashSetの構築には(わずかな)時間がかかります。配列が頻繁に変更される場合は、ループが唯一の現実的な方法です。

1
Joe White