基于 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));
}
不过,您可能想提出一个更好的算法,因为这个算法非常松散——两个相同的单词足以算作匹配。但这将符合您在问题中所述的要求。