2010-07-14 48 views
2

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

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

您的方法不适用于比较数组“猫”,“狗”,“狗”和“猫”,“猫”,“狗”。 – 2010-07-14 22:02:46

+0

更正,'是'你是正确的感谢:) – Grokodile 2010-07-14 22:16:46

+0

可能重复[是否有一个内置的方法来比较C#中的集合?](http://stackoverflow.com/questions/43500/is-there-a - 建立在方法比较集合在C) – nawfal 2013-11-08 20:29:03

回答

6

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

+0

该死,甚至不知道这个功能哈!或者忘记它,至少。 .NET 3.5中的那些小隐藏位之一。如果我有时间的话,我会去把它添加到.NET Hidden Gems线程中。 – Noldorin 2010-07-14 22:05:33

+0

如果顺序无关紧要,如果您不介意额外的处理开销,您总是可以对两个数组进行排序。 – 2010-07-14 22:09:59

2

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

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

+0

除非您还为每个单词存储计数,否则散列集方法不会正确处理重复项。 – 2010-07-14 22:11:52

+0

@Simon - 是的,我个人会使用'Dictionary '。 – IVlad 2010-07-14 22:13:18

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; 
} 
+0

这是假设元素的顺序很重要,我猜? – 2010-07-14 22:10:28

1

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

操作的结果是每一个所共有的两个数组元素。如果结果的长度等于两个数组的长度,那么这两个数组包含相同的项目。

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

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

相关问题