Peter Richieの優れた提案に基づいて、Array.Sort()
代わりにを使用しList<T>.Sort()
、重複することなく、きちんとした拡張方法に詰め込みました。
public static bool ContainsSameWordsAs(this string first, string second)
{
return first.GetSortedWords().SequenceEqual(second.GetSortedWords());
// if upper and lower case words should be seen as identical, use:
// StringComparer.OrdinalIgnoreCase as a second argument to SequenceEqual
}
private static IEnumerable<string> GetSortedWords(this string source)
{
var result = source.Split().ToArray();
Array.Sort(result);
return result;
}
使用法
string stringA = "This is a test item";
string stringB = "item test a is This";
string stringC = "Not the Same is This";
bool result = stringA.ContainsSameWordsAs(stringB); // true
bool different = stringA.ContainsSameWordsAs(stringC); // false
編集: 質問に記載されている要件に準拠していない回答を受け入れた理由を理解するのは困難です。文字列を本当に一致させたい場合は"This is a test item"
、"test a is this"
次のようなもう少し複雑なものを使用する必要があります。
public static bool ContainsSameWordsAs(this string first, string second)
{
var ignoreCase = StringComparer.OrdinalIgnoreCase;
return first.Split().Any(word => second.Split().Contains(word, ignoreCase));
}
ただし、これは非常に緩いので、より良いアルゴリズムを考え出すことをお勧めします。一致としてカウントするには、2つの同一の単語で十分です。しかし、これは質問で述べられているようにあなたの要件に一致します。