我想這並不重要,我只是好奇。爲什麼不能/不能IDictionary <TKey,TValue>實施ILookup <TKey,TValue>?
如果字典和查找之間的差異是一對一而另一對一則不會通過另一個的更具體/派生版本進行字典?
查找是可以重複鍵的鍵/值對的集合。 字典是鍵/值對的集合,其中鍵不能重複。
爲什麼IDictionary不能實現ILookup?
我想這並不重要,我只是好奇。爲什麼不能/不能IDictionary <TKey,TValue>實施ILookup <TKey,TValue>?
如果字典和查找之間的差異是一對一而另一對一則不會通過另一個的更具體/派生版本進行字典?
查找是可以重複鍵的鍵/值對的集合。 字典是鍵/值對的集合,其中鍵不能重複。
爲什麼IDictionary不能實現ILookup?
我懷疑這主要是因爲意圖不同。
ILookup<T,U>
專門設計用於處理值的集合。 IDictionary<T,U>
旨在使用單個值(當然,這可能是一個集合)。當然你可以用IDictionary<T,U>
通過返回一個值爲IEnumerable<U>
來實現這一點,這會讓人困惑,尤其是如果你的「U」是一個集合本身(即:List<int>
),尤其如此。在這種情況下,ILookup<T,U>.Item
會返回一個IEnumerable<List<int>>
,還是應該對IEnumerable<T>
值類型進行某種類型的檢查,然後將其「變平」?無論哪種方式,它會看起來很混亂,並添加可疑的價值。
我懷疑這是因爲IDictionary'2
接口早在ILookup'2
之前就出現了。回去修改是不必要的。具體實現可以使用ILookup'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>
這可能是可行的,但幾乎不乾淨。
這不只是「意圖」是不同的。字典是每個鍵的一個值。一個ILookup是每個鍵的一個或多個值。此外,ILookup只能由LINQ查詢創建,並且是不可變的;您不能在以後添加更多的鍵或值。 (至少3.5,這是真的;不知道約4.0) – 2011-02-24 02:00:19
@Cylon:ILookup是一個接口 - 如果你願意,你可以實現你自己的版本,這是不可改變的。正如我所提到的,你*可以*強迫'字典'實施'ILookup ',但如果你這樣做會令人困惑。 –
2011-02-24 02:04:51