เมื่อไม่มีข้อยกเว้นให้ไปที่ค้นหา
หากคุณพยายามที่จะทำให้โครงสร้างมีประสิทธิภาพDictionary
แต่คุณไม่ทราบแน่ชัดว่าไม่มีคีย์ที่ซ้ำกันในอินพุตLookup
นั้นปลอดภัยกว่า
ดังที่ได้กล่าวไว้ในคำตอบอื่นมันยังรองรับปุ่ม null และส่งคืนผลลัพธ์ที่ถูกต้องเสมอเมื่อถูกถามด้วยข้อมูลที่กำหนดเองดังนั้นจึงดูเหมือนว่ามีความยืดหยุ่นมากกว่าอินพุตที่ไม่รู้จัก (มีแนวโน้มน้อยกว่าพจนานุกรมเพื่อยกระดับข้อยกเว้น)
และมันเป็นเรื่องจริงโดยเฉพาะถ้าคุณเปรียบเทียบกับSystem.Linq.Enumerable.ToDictionary
ฟังก์ชั่น:
// won't throw
new[] { 1, 1 }.ToLookup(x => x);
// System.ArgumentException: An item with the same key has already been added.
new[] { 1, 1 }.ToDictionary(x => x);
ทางเลือกอื่นคือการเขียนรหัสการจัดการคีย์ซ้ำภายในforeach
ลูป
ข้อพิจารณาด้านประสิทธิภาพพจนานุกรม: ผู้ชนะที่ชัดเจน
หากคุณไม่ต้องการรายการและคุณจะจัดการรายการจำนวนมากDictionary
(หรือแม้แต่โครงสร้างที่ปรับแต่งเองของคุณเอง) จะมีประสิทธิภาพมากขึ้น:
Stopwatch stopwatch = new Stopwatch();
var list = new List<string>();
for (int i = 0; i < 5000000; ++i)
{
list.Add(i.ToString());
}
stopwatch.Start();
var lookup = list.ToLookup(x => x);
stopwatch.Stop();
Console.WriteLine("Creation: " + stopwatch.Elapsed);
// ... Same but for ToDictionary
var lookup = list.ToDictionary(x => x);
// ...
เช่นเดียวLookup
กับที่ต้องรักษารายการของแต่ละคีย์มันจะช้ากว่า Dictionary (ประมาณ 3x ช้ากว่าสำหรับรายการจำนวนมาก)
ความเร็วในการค้นหา: การสร้าง: 00: 00: 01.5760444
ความเร็วพจนานุกรม: การสร้าง: 00: 00: 00.4418833