KeyValuePair列表和相同類型的字典之間有什麼區別?有適當的時間使用其中一種嗎?您何時使用List <KeyValuePair <T1, T2>>而不是字典<T1, T2>?
回答
當你不需要在密鑰上快速查找時 - 維護Dictionary
使用的哈希表具有一定的開銷。
從http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx:
KeyValuePair
與DictionaryEntry
[克齊斯茨托夫·克瓦林納]我們與 實施
IEnumerable
上Dictionary<K,V>
討論的一個問題。IEnumerable.GetEnumerator().Current
應返回什麼類型?KeyValuePair<K,V>
或DictionaryEntry
?相同的ICollection.CopyTo
。什麼 類型應該被複制到數組的實例?我們決定如下:
IEnumerable
和ICollection
接口 實施將使用KeyValuePair<K,V>
作爲項目類型。IDictionary
特定會員 (GetEnumerator
返回IDictionaryEnumerator
)將使用DictionaryEntry
作爲項目類型。的原因是,我們是在做一個改變,其中
IEnumerator<T>
將延長IEnumerator
的過程 。如果從Dictionary<K,V>
→IEnumerable<T>
→IEnumerable
我們突然改變了從枚舉數返回的 項的類型,這將是非常奇怪的 。
在用於silverlight的SOAP webservices中,我們發現Dictionary不會序列化。這將是一種情況,您可以在Dictionary上使用KeyValuePair列表。
。
當你關心的項目的順序列表也將是有益的。
不會[SortedDictionary](https://msdn.microsoft.com/en-us/library/f7fta44c.aspx)覆蓋此? – 2015-02-18 00:11:15
是的,但SortedDictionary無法覆蓋值的順序,只有鍵。 – ConfusedMan 2015-04-15 21:04:44
除了Phillip Ngan的答案,SOAP或其他,你不能XML序列化實現IDictionary的對象。
問:爲什麼我不能序列化哈希表?
答:XmlSerializer無法處理實現IDictionary接口的類。這部分是由於進度的限制,部分是由於這樣的事實,一個哈希表沒有在XSD類型系統的配對。唯一的解決方案是實現一個不實現IDictionary接口的自定義哈希表。
字典是泛型類型包含鍵值對的集合。由於在內部使用散列函數,所以字典對於查找操作是快速的。這意味着,所有密鑰必須在字典中唯一。
考慮這方面的例子:
List<KeyValuePair<int, string>> pairs = new List<KeyValuePair<int, string>>();
pairs.Add(new KeyValuePair<int, string>(1, "Miroslav"));
pairs.Add(new KeyValuePair<int, string>(2, "Naomi"));
pairs.Add(new KeyValuePair<int, string>(2, "Ingrid"));
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "Miroslav");
dict.Add(2, "Naomi");
dict.Add(2, "Ingrid"); // System.ArgumentException: An item with the same key has already been added.
所以,你應該考慮兩個至少兩件事情:
- 你要搜索的字典具體項目?
- 是否需要某些字段 非唯一(例如pair:firstname/lastname)。
我認爲這裏的要點是字典鍵必須是唯一的,其中List
@BrunoBieri List
@niksofteng你是絕對正確的。我的錯。 – 2017-06-06 19:57:54
- 1. Tuple之間的轉換<T1,T2>和KeyValuePair <T1, T2>
- 2. 選擇字典<T1, T2> with LINQ
- 3. 元組如何創建<T1,T2>。創建<T1,T2>(T1 item1,T2 item2)?
- 4. List <Tuple<T1,T2>>作爲GridView的DataSource
- 5. struct s {T0 t0; T1 t1; ...}和std :: tuple <T0,T1,...> t
- 6. 詞典<字符串,MyClass的>爲List <KeyValuePair <字符串,字符串>>其中KeyValuePair值是MyClass.ToString()
- 7. 如何轉換List <KeyValuePair <string,decimal >> list = new List <KeyValuePair <string,decimal >>();到DataTable?
- 8. 如何循環兩對STL集<pair<t1,t2>,對<t1,t2>>中的所有元素?
- 9. 如何使用矢量<T2>代替矢量<T1>,當T2是C++中T1的子類?
- 10. Java字典<String,List <Object>>
- 11. 如何從IEnumerable <T1>中檢索IEnumerable <T2>?
- 12. ASP.NET中繼器 - 顯示屬性列表<T1> Databound List <T>
- 13. 將IList <T1>轉換爲IList <BaseT1>
- 14. Simply IEnumerable <int> to List <KeyValuePair <int, int>>?
- 15. 實現抽象方法返回類型<T1<T2>>
- 16. 請求體的List <KeyValuePair <字符串,字符串>>
- 17. 表達式<Func <T1,T2,TResult >>和Sql IN
- 18. 轉換授人以行動<T>(動作<T1,T2>)
- 19. 構造,從類型<T1>
- 20. .NET MVC的ViewPage <T1>和ViewUserControl <T2>行爲
- 21. Promise的TypeScript參數<T>,Why not Promise <T1,T2>?
- 22. 序列化一個List <KeyValuePair <字符串,對象>>
- 23. 不能從`Expression <Func<T1, T2>>`轉換爲`Expression <Func <object,object >>`
- 24. 爲什麼從模板<typename T1,typename T2>到模板<typename T1,int i>不支持類專業化
- 25. 從IEnumerable重新創建一個字典<KeyValuePair <>>
- 26. 如何將List <KeyValuePair <int,int>>轉換爲int [] []?
- 27. 如何表達<Func鍵<T1, bool>>轉換爲表達<Func鍵<T2, bool>>
- 28. 從2個表選擇時t1.id = t2.id和t1.name <> t2.name
- 29. 演員行動<T1>行動<T2>在c#中,其中T1和T2沒有關係
- 30. 轉換的IOrderedEnumerable <KeyValuePair <string, int>>成字典<string, int>
另外列表插入操作是更快的,在字典 – 2009-11-20 09:27:01
是不是KeyValuePair是隻讀? – 2016-12-27 04:55:34
其字段是隻讀的,但您可以隨時替換列表中的整個元素。 – 2016-12-27 06:21:09