2011-11-14 190 views
2

假設我有一個名爲MyClass的類,它有兩個屬性(int Id和一個字符串名稱)。我想從另一個集合中填充這些MyClass對象的列表,但我只想要唯一的。這個其他集合是一個第三方對象,它具有一個名爲'屬性'的屬性,它只是一個值數組,其中前兩個對應於我關心的Id和Name值。在這個集合中可以有重複,所以我只需要唯一的。爲什麼這個LINQ查詢不能按預期工作?

這似乎應該做的伎倆,但它不會,它會返回所有的物品,無論愚蠢。我在這裏做錯了什麼?

List<MyClass> items = (from MyClass mc in collectionOfProps 
select new MyClass() { 
Id = collectionOfProps.Properties[0], 
Name = collectionOfProps.Properties[1] }).Distinct().ToList(); 
+0

這些值是什麼類型? –

+0

看着你的查詢,它對我來說很好。 –

回答

6

的問題很可能是MyClass沒有實現IEquatable<MyClass>以及覆蓋EqualsGetHashCode

爲了使Distinct()以您想要的方式工作,您必須實施IEquatable<T>。否則,它使用默認(引用相等)進行檢查,這意味着如果它們是相同的確切實例,它將僅確定元素不明確。

+0

[This page](http://blog.jordanterrell.com/post/LINQ-Distinct()-does-not-work-as-expected.aspx)似乎解釋了爲什麼實現'IEquatable '不一定會修復問題本身。 – Brian

+0

@Brian:他也需要'GetHashCode()'。 – SLaks

+0

@SLaks:是的,但將'GetHashCode'填充到'IEqualityComparer'中也無濟於事(顯然,將它放在* will *類型的幫助中)。無論如何,那篇文章中的人試圖避免使用'GetHashCode',並被迫做了一件難看的事來完成他的目標。 – Brian

0

您是否在MyClass中重寫了平等(for distinct)?我的猜測是否定的。

根據該文檔:

http://msdn.microsoft.com/en-us/library/bb348436.aspx

默認的相等比較,缺省情況下,用於比較實施IEquatable(OF T)通用接口的類型的值。要比較自定義數據類型,您需要實現此接口併爲該類型提供您自己的GetHashCode和Equals方法。

1

你需要重寫Equals()GetHashCode()按值進行比較的情況。

+0

SLaks是正確的。至少在.NET 4.0中,'Distinct'是使用'Set'(與'HashSet'類似的'''internal'框架類)實現的。 – Brian

相關問題