LINQ - แปลงรายการเป็นพจนานุกรมโดยมีค่าเป็นรายการ


101

ฉันมี

List<MyObject> 

ที่ฉันดึงมาจากฐานข้อมูล อย่างไรก็ตามฉันต้องการให้คีย์โดยคุณสมบัติใน MyObject เพื่อวัตถุประสงค์ในการจัดกลุ่ม วิธีที่ดีที่สุดสำหรับ LINQ ในการส่งรายการของฉันไปที่:

Dictionary<long, List<MyObject>>

ฉันมีสิ่งต่อไปนี้:

myObjectList.ToDictionary(x => x.KeyedProperty)

แต่ผลตอบแทน:

Dictionary<long, MyObject>

คุณต้องการให้พจนานุกรมถูกกำหนดให้ถูกต้องของ MyObject? - คุณมีรายชื่อทั้งหมด ....
James Curran

คำตอบ:


194

ดูเหมือนว่าคุณต้องการจัดกลุ่มMyObjectอินสแตนซ์ตามKeyedPropertyและจัดกลุ่มนั้นเป็นไฟล์Dictionary<long,List<MyObject>>. ถ้าเป็นเช่นนั้นให้ลองทำดังต่อไปนี้

List<MyObject> list = ...;
var map = list
  .GroupBy(x => x.KeyedProperty)
  .ToDictionary(x => x.Key, x => x.ToList());

16

คุณควรใช้ToLookupวิธีการขยายในEnumerableคลาสดังนี้:

List<MyObject> list = ...;

ILookup<long, MyObject> lookup = list.ToLookup(o => o.KeyedProperty);

หากคุณต้องการวางสิ่งนั้นในพจนานุกรมคุณสามารถใช้ToDictionaryวิธีการขยายได้ดังนี้:

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);

อะไรคือความแตกต่างระหว่างคำตอบนี้กับคำตอบที่ยอมรับ ที่ไม่ILookupรักษาอ้างอิงในขณะที่คำตอบที่ได้รับการยอมรับไม่?
PatPeter

@PatPeter แนวคิดก็คือเมื่อคุณมีความสัมพันธ์แบบหนึ่งต่อกลุ่มระหว่างคีย์และรายการ a Lookup<TKey, TValue>อาจเป็นโครงสร้างที่ดีกว่าไฟล์Dictionary<TKey, TValue>.
casperOne

1
@ PatPeter ฉันจะบอกว่า ILookup เป็นโครงสร้างที่ดีกว่าที่จะใช้ (มันเหมือนกับแผนที่หลายแผนที่ไปจนถึงแผนที่ของเผด็จการถ้าคุณรู้จักอัลกอริทึมการรวบรวม C ++) แต่ก็มีปัจจัยสำคัญอย่างหนึ่งที่ต้องคำนึงถึง - การค้นหาที่สร้างขึ้นนั้นไม่เปลี่ยนรูป คุณไม่สามารถเพิ่มหรือลบรายการได้ในภายหลัง
gbjbaanb

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