คุณจะใช้ List <KeyValuePair <T1, T2 >> แทน Dictionary <T1, T2> เมื่อใด


96

อะไรคือความแตกต่างระหว่างรายการ KeyValuePair และพจนานุกรมสำหรับประเภทเดียวกัน มีเวลาที่เหมาะสมที่จะใช้อย่างใดอย่างหนึ่งหรือไม่?

คำตอบ:


81

เมื่อคุณไม่ต้องการการค้นหาคีย์อย่างรวดเร็ว - การดูแลแฮชแท็กที่ใช้โดยDictionaryมีค่าใช้จ่ายที่แน่นอน


9
นอกจากนี้การดำเนินการแทรกรายการยังเร็วกว่าในพจนานุกรม
Vadym Stetsiak

2
เขตข้อมูลเป็นแบบอ่านอย่างเดียว แต่คุณสามารถแทนที่องค์ประกอบทั้งหมดในรายการได้ตลอดเวลา
Pavel Minaev

ความแตกต่างเพิ่มเติมที่นี่
Vinni

63

ในระยะสั้นรายการไม่ได้บังคับใช้ความเป็นเอกลักษณ์ของคีย์ดังนั้นหากคุณต้องการความหมายนั้นนั่นคือสิ่งที่คุณควรใช้


7
+1 โปรดทราบว่าพจนานุกรมไม่ได้บังคับใช้ความเป็นเอกลักษณ์ของค่าเช่นกัน!
gdoron รองรับ Monica

25

พจนานุกรมเป็นประเภททั่วไปที่มีคอลเลกชันของคู่คีย์ - ค่า พจนานุกรมเป็นไปอย่างรวดเร็วสำหรับการดำเนินการค้นหาเพราะเป็นโดยใช้ฟังก์ชั่นภายในกัญชา นั่นหมายถึงกุญแจทั้งหมดต้องไม่ซ้ำกันในพจนานุกรม

ลองพิจารณาตัวอย่างนี้:

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.

ดังนั้นคุณควรพิจารณาสองสิ่งอย่างน้อยสองสิ่งเสมอ:

  1. คุณต้องการค้นหารายการที่เป็นรูปธรรมในพจนานุกรมหรือไม่?
  2. คุณต้องการให้บางฟิลด์ไม่ซ้ำกัน (เช่นคู่: ชื่อ / นามสกุล)

1
ฉันคิดว่าประเด็นตรงนี้คือคีย์พจนานุกรมต้องไม่ซ้ำกันโดยที่คีย์ List <KeyValuePair> ต้องไม่ซ้ำกัน
Bruno Bieri

6
@BrunoBieri รายการคีย์ <KeyValuePair> อาจไม่ซ้ำกัน
Nikhil Vartak

2
ฉันแก้ไขความคิดเห็นเก่า 2 ปีของคุณแล้วและคุณสังเกตเห็นว่า ไม่แปลกใจเลยว่าทำไม SO ถึงเป็นแพลตฟอร์มถามตอบที่น่าเชื่อถือและเป็นที่นิยมมากที่สุด
Nikhil Vartak

14

รายการนี้ยังมีประโยชน์เมื่อคุณสนใจเกี่ยวกับลำดับของรายการ


2
SortedDictionaryจะไม่ครอบคลุมสิ่งนี้หรือไม่?
Alex Angas

2
ใช่ แต่ SortedDictionary ไม่สามารถครอบคลุมลำดับของค่าได้เฉพาะคีย์เท่านั้น
ConfusedMan

7

นอกเหนือจากคำตอบของ Phillip Ngan SOAP หรืออื่น ๆ คุณไม่สามารถทำให้ XML เป็นอนุกรมวัตถุที่ใช้ IDictionary ได้

ถาม: เหตุใดฉันจึงไม่สามารถจัดลำดับแฮชแท็กได้

ตอบ: XmlSerializer ไม่สามารถประมวลผลคลาสที่ใช้อินเทอร์เฟซ IDictionary สาเหตุส่วนหนึ่งมาจากข้อ จำกัด ของตารางเวลาและส่วนหนึ่งมาจากการที่แฮชแท็กไม่มีคู่ในระบบประเภท XSD ทางออกเดียวคือใช้แฮชแท็กที่กำหนดเองที่ไม่ได้ใช้อินเทอร์เฟซ IDictionary

จากที่นี่


5

ในเว็บเซิร์ฟเวอร์ SOAP สำหรับ Silverlight เราพบว่า Dictionary ไม่ได้ทำให้เป็นอนุกรม นี่จะเป็นสถานการณ์ที่คุณจะใช้รายการ KeyValuePair ผ่านพจนานุกรม

.


3

จากhttp://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :

KeyValuePairเทียบกับDictionaryEntry
[Krzysztof Cwalina]

เราได้พูดถึงปัญหาเกี่ยวกับการดำเนินการเกี่ยวกับ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 จู่ๆเราก็เปลี่ยนประเภทของรายการที่ส่งคืนจากตัวนับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.