2010-07-14 88 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操作的結果長度爲零(意味着沒有元素對於僅一個數組是唯一的)。

雖然我不完全確定函數如何處理重複。