2013-03-06 66 views
1

我使用它可以作爲代表的結構:是否存在與IEnumerable <KeyValuePair <TKey,TValue >>相同的結構?

​​

鑑於它太長寫(不包括該代碼分析可能會發出警告),我更願意使用一些更富有表現力的類型。 在.NET Framework中是否有這樣的類型,還是應該創建自己的?

請注意,這是不一樣的字典:

IDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>> 

因爲字典確保每個密鑰都是唯一的,這不是我的情況。我不能使用查找既不:

Lookup<TKey, TValue> : IEnumerable<IGrouping<TKey, TValue>> 

因爲查找是不是懶惰的,即它需要的所有數據,以便刷新到組它。

+0

你需要添加,刪除,查找等時間複雜度? – 2013-03-06 21:16:08

+1

'IEnumerable >'鍵入的時間更短... – 2013-03-06 21:16:40

+0

實現上是否需要其他約束? – 2013-03-06 21:16:43

回答

2

這是一樣好,它會得到。結構KeyValuePair不會以接口的方式實現。你當然可以使用接口繼承創建自己的接口,基本上讓你重命名爲IEnumerable<KeyValuePair<TKey, TValue>> ,但是這樣做會讓你失去更多,因爲實現IEnumerable<KeyValuePair<TKey, TValue>>的類型不會實現你的自定義接口。

0

我沒有意識到框架中的任何東西,它代表了這種結構,除了你已經排除的Dictionary以外。

0

不在.NET Framework中,沒有。

6

如果你有兩種特定類型的鍵,你可以通過做使用類型別名值:

using PairSequence = System.Collections.Generic.IEnumerable< 
    System.Collections.Generic.KeyValuePair<string, int>>; 
+0

+1 - A *使用別名指令*。我沒有意識到這些:) http://msdn.microsoft.com/en-us/library/sf0df423.aspx – 2013-03-06 21:22:51

+0

+1 to'using' answers ... – 2013-03-06 21:25:56

1

(半開玩笑半認真地)

IEnumerable<KeyValuePair<TKey, TValue>> <= length: 40 chars 
IEnumerable<Tuple<TKey,TValue>> <= length: 32 chars 
IList<Tuple<TKey,TValue>> <= length: 26 chars 

您也許能夠裂傷一些using使用在某些情況下,還有:

using IEI = IEnumerable<int>; // for example 
0

的問題只是執行IEnumerable<KeyValuePair<TKey,TValue>>是你沒有任何後備存儲。

作爲一般規則,您應該實現代表問題域中的事物的類型,即使是數字和字符串等事物。例如,使用字符串來表示一個zip /郵政編碼,並不會告訴您有關數據類型的更多信息,但使用名爲PostalCode的自定義數據類型會告訴您更多信息。更好的是摘要數據類型PostalCode(它可能有國家特定的具體實現)。

您的自定義類型(特別是集合類型)只能公開您需要的功能,而不提供非特定集合類所具有的所有功能。此外,您可以實施與問題域相關的域限制。例如,從抽象類型PostalCode繼承的具體UsZipCode可能會將值限制爲5或9個十進制數字,而具體的CanadianPostalCode可能需要該值由2個3個字符的字母數字序列組成。

但我離題了。

我可能會簡單地創建我自己的類這樣的:

public class MyListOfKeysAndValues : IList<KeyValuePair<MyKeyType,MyValueType>> 
{ 
    private List<KeyValuePair<MyKeyType,MyValueType>> MyBackingStore ; 
    ... 
} 

揭露最小的方法/需要的屬性。

+0

創建一個自定義類型是微不足道的,只需要一個構造函數它接受一個'IEnumerable >',實現該接口,並讓所有方法都重定向到您在構造函數中接受的實例。除了名稱較短之外,該類型不會執行任何操作,並將所有調用重定向到封裝對象。爲了清理代碼,這可以起到有用的作用。 OP詢問他是否可以避免創建自己的自定義類型。 – Servy 2013-03-06 21:43:43

相關問題