編集
IEnumerable<KeyValuePair<TKey, TValue>>
から暗黙的に取得する必要があると本当に感じている場合Dictionary
は、この拡張機能を追加できます。
public static IDictionary<TKey, ToValue> ToDictionary<TKey, TValue>(
this IEnumerable<KeyValuePair<TKey, TValue>> source)
{
return source.ToDictionary(p => p.Key, p => p.Value);
}
次にToDictionary()
、任意のIEnumerable<KeyValuePair<TKey, TValue>>
.
編集2
重複が予想される場合は、ToLookup()
拡張機能も作成できます。
public static ILookup<TKey, TValue> ToLookup<TKey, TValue>(
this IEnumerable<KeyValuePair<TKey, TValue>> source)
{
return source.ToLookup(p => p.Key, p => p.Value);
}
または、本当に結果を破棄したい場合は、 のオーバーロードを追加できます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));
}
「最初の」項目以外のすべてを任意に破棄する場合 (それが なしで意味することは何OrderBy
ですか) 、この拡張機能を次のように使用できます。
pairs.ToDictionary(v => v.First());
全体として、ほとんどのコードを削除して、
var q = from p in pl
where p.Name.First() == 'A';
var d = q.ToDictionary(p => p.NickName, p => p.Name);
重複する可能性がある場合は、
var d = q.ToLookup(p => p.NickName, p => p.Name);
ただし、これは を返しILookup<TKey, TElement>
、そのItem
インデクサーは を返すIEnumerable<TElement>
ため、データを破棄しないことに注意してください。