MODIFIER
Si vous vous sentez vraiment que vous devez obtenir à partir de IEnumerable<KeyValuePair<TKey, TValue>>
d'un Dictionary
implicitement vous pouvez ajouter cette extension.
public static IDictionary<TKey, ToValue> ToDictionary<TKey, TValue>(
this IEnumerable<KeyValuePair<TKey, TValue>> source)
{
return source.ToDictionary(p => p.Key, p => p.Value);
}
Vous pouvez ensuite appeler ToDictionary()
sur tout IEnumerable<KeyValuePair<TKey, TValue>>
.
EDIT 2
Si vous êtes en anticipant les doublons, vous pouvez créer une ToLookup()
extension.
public static ILookup<TKey, TValue> ToLookup<TKey, TValue>(
this IEnumerable<KeyValuePair<TKey, TValue>> source)
{
return source.ToLookup(p => p.Key, p => p.Value);
}
Alternativement, si vous voulez vraiment jeter résultats, vous pouvez ajouter une surcharge pour l' 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));
}
Si vous arbitrairement jeter tout le mais la "première" (ça veut dire sans OrderBy
) de l'élément, vous pouvez utiliser cette extension comme ceci,
pairs.ToDictionary(v => v.First());
Dans l'ensemble, vous pouvez supprimer la plupart de votre code et de le faire,
var q = from p in pl
where p.Name.First() == 'A';
var d = q.ToDictionary(p => p.NickName, p => p.Name);
S'il pouvait y avoir des doublons, ne
var d = q.ToLookup(p => p.NickName, p => p.Name);
mais attention, il renvoie un ILookup<TKey, TElement>
, l' Item
indexeur qui renvoie une IEnumerable<TElement>
de sorte que vous ne jetez pas de données.