Carte deux listes dans un dictionnaire en C#
Donné deux IEnumerable
s de la même taille, comment puis-je convertir Dictionary
à l'aide de Linq?
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 la sortie attendue est:
A: Val A
B: Val B
C: Val C
Je me demande si il y a un moyen simple pour y parvenir.
Et devrais-je être inquiet au sujet de la performance? Que faire si j'ai de grandes collections?
Je ne suis pas si il y a un moyen plus facile de le faire, actuellement, je fais comme ceci:
J'ai une méthode d'Extension qui boucle la IEnumerable
qui m'a fourni l'élément et le numéro d'index.
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 j'ai une méthode qui boucle l'un des Enumerables et avec l'indice de récupérer l'élément équivalent sur les autres Énumérable.
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;
}
Puis-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
Vous devez vous connecter pour publier un commentaire.
Avec .NET 4.0 (ou la version 3.5 de Système.Interactif de Rx), vous pouvez utiliser
Zip()
:Zip
méthode. Si ce n'est plus typé statiquement langues de soutien générique des paramètres variants.,Select
serait en mesure de gérer cela (commemap
dans le Schéma).Ou en fonction de votre idée, LINQ comprend une surcharge de
Select()
qui fournit l'indice. Combiné avec le fait quevalues
prend en charge l'accès par index, on peut effectuer les opérations suivantes:(Si
values
est conservé commeList<string>
, qui est...)J'aime cette approche:
Si vous utilisez MoreLINQ, vous pouvez également utiliser du ToDictionary extension de la méthode précédemment créé
KeyValuePair
s:Il convient également de noter que l'utilisation de
Zip
méthode d'extension est protégé contre l'entrée des collections de différentes longueurs.