สร้างพจนานุกรมขึ้นใหม่จาก IEnumerable <KeyValuePair <>>


173

ฉันมีวิธีการที่คืนค่าIEnumerable<KeyValuePair<string, ArrayList>>แต่ผู้โทรบางรายต้องการผลลัพธ์ของวิธีการเป็นพจนานุกรม ฉันจะแปลงIEnumerable<KeyValuePair<string, ArrayList>>เป็นDictionary<string, ArrayList>สิ่งที่ฉันสามารถใช้ได้TryGetValueอย่างไร?

วิธี:

public IEnumerable<KeyValuePair<string, ArrayList>> GetComponents()
{
  // ...
  yield return new KeyValuePair<string, ArrayList>(t.Name, controlInformation);
}

โทร:

Dictionary<string, ArrayList> actual = target.GetComponents();
actual.ContainsKey("something");

เป็นไปได้ซ้ำไหม stackoverflow.com/questions/7850334/…
Coolkau

คำตอบ:


329

หากคุณใช้. NET 3.5 หรือ. NET 4 คุณสามารถสร้างพจนานุกรมโดยใช้ LINQ ได้อย่างง่ายดาย:

Dictionary<string, ArrayList> result = target.GetComponents()
                                      .ToDictionary(x => x.Key, x => x.Value);

ไม่มีสิ่งเช่นเดียวกับIEnumerable<T1, T2>แต่KeyValuePair<TKey, TValue>เป็นเรื่องปกติ


15
คุณคิดว่าจะมีการโทรที่ไม่ต้องใช้อาร์กิวเมนต์เนื่องจาก Dictionary <TKey, TValue> ใช้ IEnumerable <KeyValuePair <TKey, TValue >> แต่ก็ดี ง่ายพอที่จะทำให้คุณเอง
Casey

6
@DanVerdolino ฉันรู้ว่า คุณคิดว่าเพราะมันเป็นหนึ่งในสิ่งที่พบได้บ่อยที่สุดที่คุณอาจต้องการทำกับ KVP ของ IEnumerable
Casey

17
ปี 2016 ตอนนี้และฉันยังต้อง google สิ่งนี้ คุณคิดว่าจะมีคอนสตรัคสำหรับDictionaryที่เอาIEnumerable<KeyValuePair<TKey, TValue>>เช่นเดียวกับยิงList<T> IEnumerable<T>ยังไม่มีAddRangeหรือแม้กระทั่งAddที่ใช้คู่คีย์ / ค่า เกิดอะไรขึ้นกับสิ่งนั้น
die maus

5
ตอนนี้เป็นปี 2017 และเราสามารถเพิ่มสิ่งนี้เป็นวิธีการขยายได้!
Chris Bush

2
จำนวนมากของ "ฉันไม่สามารถเชื่อหลัก .net ไม่มี <คุณลักษณะที่เห็นได้ชัด>" ได้รับการแก้ไขผ่านทางMoreLinq รวมถึง IEnumerable <KeyValuePair> แบบไม่ระบุพารามิเตอร์ ->ToDictionary()
aaaaaa

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