有没有更好的方法来检查两个字符串数组是否具有相同的内容?
string[] first = new string[]{"cat","and","mouse"};
string[] second = new string[]{"cat","and","mouse"};
bool contentsEqual = true;
if(first.Length == second.Length){
foreach (string s in first)
{
contentsEqual &= second.Contains(s);
}
}
else{
contentsEqual = false;
}
Console.WriteLine(contentsEqual.ToString());// true
答案 0 :(得分:6)
Enumerable.SequenceEquals如果他们应该按照相同的顺序。
答案 1 :(得分:2)
您应该考虑使用intersect方法。它将为您提供所有匹配值,然后您可以将结果数组的计数与被比较的数组进行比较。
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx
答案 2 :(得分:2)
这是O(n^2)
。如果数组具有相同的长度,则对它们进行排序,然后比较相同位置的元素。这是O(n log n)
。
或者您可以使用hash set或dictionary:在第一个数组中插入每个单词,然后查看第二个数组中的每个单词是否在集合或字典中。这平均为O(n)
。
答案 3 :(得分:1)
该方法的逻辑没有错,但是您在第一个序列中为每个项目测试Contains
这一事实意味着该算法通常在O(n^2)
时间内运行。您还可以进行一两个其他较小的优化和改进
我会实现如下功能。这样定义一个扩展方法(例如在.NET 4.0中)。
public static bool SequenceEquals<T>(this IEnumerable<T> seq1, IEnumerable<T> seq2)
{
foreach (var pair in Enumerable.Zip(seq1, seq2)
{
if (!pair.Item1.Equals(pair.Item2))
return;
}
return false;
}
答案 4 :(得分:1)
您可以尝试Enumerable.Intersect:http://msdn.microsoft.com/en-us/library/bb460136.aspx
操作的结果是两个数组共有的每个元素。如果结果的长度等于两个数组的长度,则两个数组包含相同的项。
Enumerable.Union:http://msdn.microsoft.com/en-us/library/bb341731.aspx也会奏效;只需检查Union操作的结果是否为零(意味着没有元素只对一个数组唯一);
虽然我不确定函数如何处理重复项。