EDIT
Jeśli naprawdę czujesz, że trzeba się z IEnumerable<KeyValuePair<TKey, TValue>>
do Dictionary
domyśle można dodać to rozszerzenie.
public static IDictionary<TKey, ToValue> ToDictionary<TKey, TValue>(
this IEnumerable<KeyValuePair<TKey, TValue>> source)
{
return source.ToDictionary(p => p.Key, p => p.Value);
}
Następnie można nazwać ToDictionary()
na dowolnym IEnumerable<KeyValuePair<TKey, TValue>>
.
EDIT 2
Jeśli przewidywania duplikaty a następnie można utworzyć ToLookup()
rozszerzenie zbyt.
public static ILookup<TKey, TValue> ToLookup<TKey, TValue>(
this IEnumerable<KeyValuePair<TKey, TValue>> source)
{
return source.ToLookup(p => p.Key, p => p.Value);
}
Alternatywnie, jeśli naprawdę chcesz, aby odrzucić wyniki, można dodać przeciążenie dla 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));
}
Jeśli arbitralnie odrzucić wszystko, ale „pierwsze” (co to znaczy bez OrderBy
) elementu, można użyć tego rozszerzenia w ten sposób,
pairs.ToDictionary(v => v.First());
Ogólnie rzecz biorąc, można usunąć większość kodu i zrobić,
var q = from p in pl
where p.Name.First() == 'A';
var d = q.ToDictionary(p => p.NickName, p => p.Name);
Gdybym mógł tam być duplikatów, do
var d = q.ToLookup(p => p.NickName, p => p.Name);
ale uwaga, to zwraca ILookup<TKey, TElement>
The Item
podziałowe z których zwraca IEnumerable<TElement>
więc nie odrzucić dane.
jak o 'new Dictionary (d1);' lub 'd1 = q.ToDictionary (p => p.Key, p => p.Value);' – Jodrell
@Jodrell powodzenia kompilowanie tego 'nowego' oświadczenia – Alex
@Alex, masz rację, nie ma' IEnumerable> 'Przeciążenie contructor. –
Jodrell