Étant donné deuxIEnumerable
s de la même taille, comment puis-je le convertir en unDictionary
LINQ?Carte deux listes dans un dictionnaire en C#
IEnumerable<string> keys = new List<string>() { "A", "B", "C" };
IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C" };
var dictionary = /* Linq ? */;
Et le résultat attendu est:
A: Val A
B: Val B
C: Val C
Je me demande s'il y a un moyen simple pour y parvenir.
Et devrais-je m'inquiéter de la performance? Et si j'ai de grandes collections?
Je ne sais pas s'il y a un moyen plus facile de le faire, actuellement, je fais comme ceci:
J'ai une méthode d'extension qui bouclera le IEnumerable
me fournissant l'élément et l'indice nombre.
public static class Ext
{
public static void Each<T>(this IEnumerable els, Action<T, int> a)
{
int i = 0;
foreach (T e in els)
{
a(e, i++);
}
}
}
et moi avons une méthode qui boucle l'un des Enumerables et l'indice de récupérer l'élément équivalent de l'autre Enumerable.
public static Dictionary<TKey, TValue> Merge<TKey, TValue>(IEnumerable<TKey> keys, IEnumerable<TValue> values)
{
var dic = new Dictionary<TKey, TValue>();
keys.Each<TKey>((x, i) =>
{
dic.Add(x, values.ElementAt(i));
});
return dic;
}
Je l'utiliser comme:
IEnumerable<string> keys = new List<string>() { "A", "B", "C" };
IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C" };
var dic = Util.Merge(keys, values);
Et la sortie est correcte:
A: Val A
B: Val B
C: Val C
Pouce pour .Zip. Heureux que ça soit dans la BCL. J'ai eu ma propre version depuis un certain temps. – spender
@spender - Même si vous avez fait votre propre, je le prendrais de [Eric Lipperts Blog] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/07/zip-me-up. aspx) – Oliver
Dommage qu'il y ait un besoin pour une méthode 'Zip'. Si seulement plus de langages statiquement typés supportaient des paramètres variadiques génériques, 'Select' gèrerait ceci (comme' map' dans Scheme). – leppie