Tạo lại một từ điển từ một <KeyValuePair <>>


172

Tôi có một phương thức trả về một IEnumerable<KeyValuePair<string, ArrayList>>, nhưng một số người gọi yêu cầu kết quả của phương thức là một từ điển. Làm thế nào tôi có thể chuyển đổi IEnumerable<KeyValuePair<string, ArrayList>>thành một Dictionary<string, ArrayList>để tôi có thể sử dụng TryGetValue?

phương pháp:

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

người gọi

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

Câu trả lời:


328

Nếu bạn đang sử dụng .NET 3.5 hoặc .NET 4, thật dễ dàng để tạo từ điển bằng LINQ:

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

Không có cái gì như một IEnumerable<T1, T2>nhưng một KeyValuePair<TKey, TValue>là tốt.


15
Bạn sẽ nghĩ rằng sẽ có một cuộc gọi không yêu cầu đối số, do Từ điển <TKey, TValue> thực hiện IEnumerable <KeyValuePair <TKey, TValue >>, nhưng ồ. Đủ dễ dàng để làm cho riêng bạn.
Casey

6
@DanVerdolino Tôi biết điều đó. Bạn sẽ nghĩ rằng bởi vì nó giống như một trong những điều phổ biến nhất bạn có thể muốn làm với vô số KVP.
Casey

17
2016 bây giờ, và tôi vẫn phải google cái này. Bạn sẽ nghĩ rằng sẽ có một nhà xây dựng cho việc Dictionaryđó IEnumerable<KeyValuePair<TKey, TValue>>giống như List<T>mất một IEnumerable<T>. Ngoài ra, không có AddRangehoặc thậm chí Addmất các cặp khóa / giá trị. Có chuyện gì thế?
chết

5
Bây giờ là năm 2017 và chúng ta có thể thêm điều này như một phương thức mở rộng!
Chris Bush

2
Rất nhiều "Tôi không thể tin rằng lõi .net không có <tính năng rõ ràng>" được giải quyết thông qua MoreLinq . Bao gồm một IE không đếm được <KeyValuePair> ->ToDictionary()
aaaaaa

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.