2009-01-30 37 views
36

我想確定.NET 3.5(C#)中的兩個對象HashSet是否相等,包含相同的值。這看起來像是人們顯然想要做的事情,但所提供的功能似乎沒有給你提供這些信息。如何確定兩個HashSets是否相等(按值,而不是按引用)?

我認爲這樣做的方式是通過檢查兩組的計數是否相等一組是另一組的一個子組(不適當)。我認爲唯一可以發生的方式是,如果他們是平等的。示例代碼:

HashSet<int> set1 = new HashSet<int>(); 
set1.Add(1); 
set1.Add(2); 
set1.Add(3); 

HashSet<int> set2 = new HashSet<int>(); 
set2.Add(1); 
set2.Add(2); 
set2.Add(3); 

if(set1.Count == set2.Count && set1.IsSubsetOf(set2)) 
{ 
    // do something 
} 

這會始終有效嗎?有沒有更好的辦法?爲什麼HashSetpublic bool IsEqualSetWith()的功能?

+0

雖然這是真的,SetEquals()會工作,這顯然不是好OO方面的理想解決方案。理想情況下,我想使用ICollection 或IEnumerable 等接口。當您爲其他開發人員開發平臺時,這不是一些完美主義的象牙塔,而是非常真實的API設計考慮因素。無論如何,如果我的API接受ICollection 作爲參數,我希望能夠調用.Equals()將參數與一些已知值進行比較。如果調用者給我一個列表,並且將其與我的API方法中的一個列表進行比較,(續) – 2011-11-01 01:46:28

+1

它被稱爲IEqualityComparer :) – 2012-09-24 23:26:29

+0

我想讓我的set對象找出它是我得到的列表並返回false。相反,如果調用者使用一個集合調用我的方法,並且恰好具有相同的元素,我希望我的集合對象在內部調用SetEquals(),而不必使用向下轉換並使用特殊方法。換句話說,像學校教授的那樣使用多態和封裝。它讓我震驚了C#庫如何能夠錯過這麼久,沒有人抱怨。 – 2011-11-01 01:46:28

回答

69

看看方法SetEquals

my_hashset.SetEquals(other); 
4
IEqualityComparer<HashSet<int>> comp = HashSet<int>.CreateSetComparer(); 
Console.WriteLine("CreateSetComparer set1 == set2 : {0}", comp.Equals(set1, set2)); 
// or 
bool areEqual = HashSet<int>.CreateSetComparer().Equals(set1, set2); 
相關問題