2013-03-15 44 views
2

可以說我有這樣的:Distinct()如何工作?

class Foo 
{ 
    public Guid id; 
    public string description; 
} 

var list = new List<Foo>(); 
list.Add(new Foo() { id = Guid.Empty, description = "empty" }); 
list.Add(new Foo() { id = Guid.Empty, description = "empty" }); 
list.Add(new Foo() { id = Guid.NewGuid(), description = "notempty" }); 
list.Add(new Foo() { id = Guid.NewGuid(), description = "notempty2" }); 

現在,當我這樣做:

list = list.Distinct().Tolist(); 

它顯然返回4個元素。我想要一個方法,它比較我在課堂上所有的數據,並返回唯一的元素,這些元素用於檢查類的每個屬性。我是否需要編寫自己的比較器,還是有內置的東西可以這樣工作?

+0

你必須寫自己的比較器,或者實現'IEquatable' – millimoose 2013-03-15 02:21:44

回答

6

您有另一種實現覆蓋Foo.Equals(以及隨後Foo.GetHashCode)明確地比較各個領域。否則它將使用默認實現,Object.EqualsReferenceEquals)。

或者,您可以明確地將IEqualityComparer傳遞給Distinct()方法。


不過,請注意使用匿名類不會返回3個元素。根據您要使用Foo和你需要多少編譯時類型安全,你可以這樣做:

var list = new List<dynamic>(); 
list.Add(new { id = Guid.Empty, description = "empty" }); 
list.Add(new { id = Guid.Empty, description = "empty" }); 
list.Add(new { id = Guid.NewGuid(), description = "notempty" }); 
list.Add(new { id = Guid.NewGuid(), description = "notempty2" }); 

list = list.Distinct().ToList(); //3 elements selected 
+2

我建議去了'IEqualityComparer'路線。以這種方式擴展一個類在不同上下文中的「平等」要比覆蓋「Equals」方法更容易。 – 2013-03-15 02:51:32