2011-02-24 47 views

回答

4

我懷疑這主要是因爲意圖不同。

ILookup<T,U>專門設計用於處理值的集合。 IDictionary<T,U>旨在使用單個值(當然,這可能是一個集合)。當然你可以用IDictionary<T,U>通過返回一個值爲IEnumerable<U>來實現這一點,這會讓人困惑,尤其是如果你的「U」是一個集合本身(即:List<int>),尤其如此。在這種情況下,ILookup<T,U>.Item會返回一個IEnumerable<List<int>>,還是應該對IEnumerable<T>值類型進行某種類型的檢查,然後將其「變平」?無論哪種方式,它會看起來很混亂,並添加可疑的價值。

+0

這不只是「意圖」是不同的。字典是每個鍵的一個值。一個ILookup是每個鍵的一個或多個值。此外,ILookup只能由LINQ查詢創建,並且是不可變的;您不能在以後添加更多的鍵或值。 (至少3.5,這是真的;不知道約4.0) – 2011-02-24 02:00:19

+0

@Cylon:ILookup是一個接口 - 如果你願意,你可以實現你自己的版本,這是不可改變的。正如我所提到的,你*可以*強迫'字典'實施'ILookup ',但如果你這樣做會令人困惑。 – 2011-02-24 02:04:51

1

我懷疑這是因爲IDictionary'2接口早在ILookup'2之前就出現了。回去修改是不必要的。具體實現可以使用ILookup'2。我不明白修改人們多年來一直使用的界面會帶來什麼。

+0

我想你也可以翻轉你的陳述。我沒有看到修改界面會損害什麼。是的,ILookup更新,但這並不意味着它不會描述IDictionary正在做什麼。僅僅因爲你和我看不到有什麼可以獲得的東西並不意味着它不會幫助那裏的人,這僅僅意味着我們不能親自看到如何。 – Josh 2011-02-25 16:32:05

+1

如果人們修改現有和流行界面的行爲會發生什麼?哦,爲什麼沒有傷害會出來..... – surfasb 2011-06-21 22:58:52

2

接口IDictionary<T,U>ILookup<T,U>都繼承IEnumerable。如果將IDictionary<T,U>轉換爲IEnumerable並對其調用GetEnumerator(),則生成的枚舉器應返回KeyValuePair<T,U>的實例。如果將ILookup<T,U>轉換爲IEnumerable並調用GetEnumerator(),則生成的枚舉器應返回IGrouping<T,U>的實例。如果KeyValuePair<T,U>結構被修改爲執行IGrouping<T,U>這可能是可行的,但幾乎不乾淨。

相關問題