2012-03-20 241 views
3

我想知道爲什麼GroupBy使用匿名類型。LINQ GroupBy匿名類型

List<string> values = new List<string>(); 
values.GroupBy(s => new { Length = s.Length, Value = s }) 

匿名類型沒有實現任何接口,所以我很困惑這是如何工作的。

我假設該算法是通過爲源中的每個項目創建一個匿名類型的實例並使用散列將這些項目組合在一起來工作的。但是,沒有提供IEqualityComparer來定義如何生成散列或兩個實例是否相等。那麼,我假設Object.Equals和Object.GetHashCode方法將是依賴於對象身份的後備。

那麼,它是如何按預期工作?但它在OrderBy中不起作用。匿名類型是否覆蓋Equals和GetHashCode?或者底層的GroupBy算法做了一些我還沒有想到的魔法?

回答

3

作爲每文檔,一個anonymous type is a reference type

從公共語言運行時的角度來看,一個匿名類型是從任何其他引用類型沒有什麼不同。

因此,將使用如由 System.Object(其中至少爲 equality is based on referential equality)中實現這些功能的默認實現。

編輯:其實,按照相同的第一DOCO鏈接,它說:

因爲匿名類型的Equals和GetHashCode方法的Equals和性能的GetHashCode方法的術語定義,兩個相同匿名類型的實例只有在它們的所有屬性相等時才相等。

0

它不能在OrderBy上工作,因爲新對象沒有實現IComparable。

+0

不,它不調用'ToString'。它調用'GetHashCode'和'Equals'。 – StriplingWarrior 2012-03-20 19:39:50

+0

我的壞,我刪除它。 如何做刪除線? OmegaMan 2012-03-20 19:57:01

+0

罷工標籤應該在你的實際文章中工作。雖然他們顯然在評論中逃脫了。 – StriplingWarrior 2012-03-20 20:13:08