EDIT
Nếu bạn thực sự cảm thấy bạn cần phải nhận được từ IEnumerable<KeyValuePair<TKey, TValue>>
đến một Dictionary
ngầm bạn có thể thêm phần mở rộng này.
public static IDictionary<TKey, ToValue> ToDictionary<TKey, TValue>(
this IEnumerable<KeyValuePair<TKey, TValue>> source)
{
return source.ToDictionary(p => p.Key, p => p.Value);
}
Sau đó, bạn có thể gọi ToDictionary()
trên bất kỳ IEnumerable<KeyValuePair<TKey, TValue>>
nào.
EDIT 2
Nếu bạn đang dự đoán bản sao sau đó bạn có thể tạo ra một phần mở rộng ToLookup()
quá.
public static ILookup<TKey, TValue> ToLookup<TKey, TValue>(
this IEnumerable<KeyValuePair<TKey, TValue>> source)
{
return source.ToLookup(p => p.Key, p => p.Value);
}
Hoặc, nếu bạn thực sự muốn hủy kết quả, bạn có thể thêm quá tải cho ToDictionary
.
public static IDictionary<TKey, ToValue> ToDictionary<TKey, TValue>(
this IEnumerable<KeyValuePair<TKey, TValue>> source,
Func<<IEnumerable<TValue>, TValue> selector)
{
return source
.Lookup(p => p.Key, p => p.Value);
.ToDictionary(l => l.Key, l => selector(l));
}
Nếu bạn tùy tiện vứt bỏ tất cả, nhưng "đầu tiên" (có nghĩa là gì mà không có một OrderBy
) mục, bạn có thể sử dụng phần mở rộng này như thế này,
pairs.ToDictionary(v => v.First());
Nhìn chung, bạn có thể xóa hầu hết mã của bạn và làm,
var q = from p in pl
where p.Name.First() == 'A';
var d = q.ToDictionary(p => p.NickName, p => p.Name);
Nếu có thể trùng lặp, do
var d = q.ToLookup(p => p.NickName, p => p.Name);
nhưng lưu ý, đây trả về một ILookup<TKey, TElement>
, indexer Item
trong đó trả về một IEnumerable<TElement>
do đó bạn không hủy dữ liệu.
làm thế nào về 'từ điển mới (d1);' hoặc 'd1 = q.ToDictionary (p => p.Key, p => p.Value);' – Jodrell
@Jodrell chúc may mắn biên dịch câu lệnh 'mới' – Alex
@ Alex, bạn nói đúng, không có 'IEnumerable> 'quá tải contructor. –
Jodrell