เลือกพจนานุกรม <T1, T2> ด้วย LINQ


171

ฉันใช้คีย์เวิร์ด "select" และวิธีการขยายเพื่อส่งคืนIEnumerable<T>ด้วย LINQ แต่ฉันต้องการส่งคืน generic Dictionary<T1, T2>และไม่สามารถหาคำตอบได้ ตัวอย่างฉันเรียนรู้สิ่งนี้จากการใช้บางสิ่งในรูปแบบที่คล้ายกับสิ่งต่อไปนี้:

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 };

ฉันทำสิ่งเดียวกันด้วยวิธีการขยาย ฉันคิดว่าเนื่องจากรายการใน a Dictionary<T1, T2>สามารถทำซ้ำได้เนื่องจากKeyValuePair<T1, T2>ฉันสามารถแทนที่ "SomeClass" ในตัวอย่างด้านบนด้วย " new KeyValuePair<T1, T2> { ..." แต่นั่นไม่ได้ผล (คีย์และค่าถูกทำเครื่องหมายว่าอ่านได้อย่างเดียวดังนั้นฉันจึงไม่สามารถรวบรวมรหัสนี้ได้ )

เป็นไปได้หรือฉันต้องทำหลายขั้นตอน?

ขอบคุณ

คำตอบ:


284

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

class SomeObject
{
    public int ID { get; set; }
    public string Name { get; set; }
}

SomeObject[] objects = new SomeObject[]
{
    new SomeObject { ID = 1, Name = "Hello" },
    new SomeObject { ID = 2, Name = "World" }
};

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name);

จากนั้นobjectDictionary[1]จะมีค่า "Hello"


44
var dictionary = (from x in y 
                  select new SomeClass
                  {
                      prop1 = value1,
                      prop2 = value2
                  }
                  ).ToDictionary(item => item.prop1);

นั่นคือสมมุติว่าSomeClass.prop1เป็นสิ่งที่ต้องการKeyสำหรับพจนานุกรม


27
.ToDictionary(item => item.prop1, item => item.prop2);เพื่ออธิบายตั้งค่าเช่นกัน
finoutlook

42

คอลเลกชันของKeyValuePairชัดเจนยิ่งขึ้นและดำเนินการได้เป็นอย่างดี

Dictionary<int, string> dictionary = objects
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
    .ToDictionary(x=>x.Key, x=>x.Value);

เป็นไปได้ไหมที่จะลบ. ToDictionary (x => x.Key, x => x.Value); และแทนที่ KeyValuePair ใหม่ด้วยพจนานุกรมใหม่หรือไม่
Amir Hajiha

@ AmirNo- ครอบครัวคุณเข้าใจผิด เลือก (x => x ... ) วิธีการดำเนินการประมาณการสำหรับแต่ละองค์ประกอบของการเก็บรวบรวมวัตถุ ดังนั้นการแทนที่ KeyValuePair ใหม่ด้วยพจนานุกรมใหม่จะสร้างพจนานุกรมของพจนานุกรม ฉันไม่คิดว่านั่นคือสิ่งที่คุณตั้งเป้า
Antoine Meltzheim

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