检查两个字符串数组是否等效

有没有更好的方法来检查两个字符串数组是否具有相同的内容?

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 

Enumerable.SequenceEquals如果它们应该是相同的顺序。

您应该考虑使用intersect方法。 它将为您提供所有匹配值,然后您可以将结果数组的计数与已比较的数组进行比较。

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx

这是O(n^2) 。 如果数组具有相同的长度,则对它们进行排序,然后比较相同位置的元素。 这是O(n log n)

或者您可以使用哈希集或字典 :在第一个数组中插入每个单词,然后查看第二个数组中的每个单词是否在集合或字典中。 这平均为O(n)

该方法的逻辑没有任何问题,但是您正在测试第一个序列中每个项目的Contains这一事实意味着该算法通常在O(n^2)时间内运行。 您还可以进行一个或两个其他较小的优化和改进

我会实现如下function。 这样定义扩展方法(.NET 4.0中的示例)。

 public static bool SequenceEquals(this IEnumerable seq1, IEnumerable seq2) { foreach (var pair in Enumerable.Zip(seq1, seq2) { if (!pair.Item1.Equals(pair.Item2)) return; } return false; } 

您可以尝试Enumerable.Intersect: http : //msdn.microsoft.com/en-us/library/bb460136.aspx

操作的结果是两个数组共有的每个元素。 如果结果的长度等于两个数组的长度,则两个数组包含相同的项。

Enumerable.Union: http : //msdn.microsoft.com/en-us/library/bb341731.aspx也可以; 只需检查Union操作的结果是否为零(意味着没有元素只对一个数组唯一);

虽然我不确定函数如何处理重复。