อะไรคือความแตกต่างระหว่างรายการ KeyValuePair และพจนานุกรมสำหรับประเภทเดียวกัน มีเวลาที่เหมาะสมที่จะใช้อย่างใดอย่างหนึ่งหรือไม่?
อะไรคือความแตกต่างระหว่างรายการ KeyValuePair และพจนานุกรมสำหรับประเภทเดียวกัน มีเวลาที่เหมาะสมที่จะใช้อย่างใดอย่างหนึ่งหรือไม่?
คำตอบ:
เมื่อคุณไม่ต้องการการค้นหาคีย์อย่างรวดเร็ว - การดูแลแฮชแท็กที่ใช้โดยDictionary
มีค่าใช้จ่ายที่แน่นอน
ในระยะสั้นรายการไม่ได้บังคับใช้ความเป็นเอกลักษณ์ของคีย์ดังนั้นหากคุณต้องการความหมายนั้นนั่นคือสิ่งที่คุณควรใช้
พจนานุกรมเป็นประเภททั่วไปที่มีคอลเลกชันของคู่คีย์ - ค่า พจนานุกรมเป็นไปอย่างรวดเร็วสำหรับการดำเนินการค้นหาเพราะเป็นโดยใช้ฟังก์ชั่นภายในกัญชา นั่นหมายถึงกุญแจทั้งหมดต้องไม่ซ้ำกันในพจนานุกรม
ลองพิจารณาตัวอย่างนี้:
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.
ดังนั้นคุณควรพิจารณาสองสิ่งอย่างน้อยสองสิ่งเสมอ:
รายการนี้ยังมีประโยชน์เมื่อคุณสนใจเกี่ยวกับลำดับของรายการ
นอกเหนือจากคำตอบของ Phillip Ngan SOAP หรืออื่น ๆ คุณไม่สามารถทำให้ XML เป็นอนุกรมวัตถุที่ใช้ IDictionary ได้
ถาม: เหตุใดฉันจึงไม่สามารถจัดลำดับแฮชแท็กได้
ตอบ: XmlSerializer ไม่สามารถประมวลผลคลาสที่ใช้อินเทอร์เฟซ IDictionary สาเหตุส่วนหนึ่งมาจากข้อ จำกัด ของตารางเวลาและส่วนหนึ่งมาจากการที่แฮชแท็กไม่มีคู่ในระบบประเภท XSD ทางออกเดียวคือใช้แฮชแท็กที่กำหนดเองที่ไม่ได้ใช้อินเทอร์เฟซ IDictionary
ในเว็บเซิร์ฟเวอร์ SOAP สำหรับ Silverlight เราพบว่า Dictionary ไม่ได้ทำให้เป็นอนุกรม นี่จะเป็นสถานการณ์ที่คุณจะใช้รายการ KeyValuePair ผ่านพจนานุกรม
.
จาก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
จู่ๆเราก็เปลี่ยนประเภทของรายการที่ส่งคืนจากตัวนับ