12
votes

C # LINQ - Convertir Dictionnaire imbriqué vers une liste

Comment puis-je aplaticez un dictionnaire imbriqué dans une liste de certains objets ( ToNOObject code> dans l'exemple suivant) qui devrait contenir des touches de ces dictionnaires?

Par exemple: Dictionnaire a dicté Suivi de type p> xxx pré>

alors, ayons cette classe p> xxx pré>

comment puis-je convertir NuShictionary code> à une liste code> où var1 code> est la clé du dictionnaire externe, var2 code> est la clé du dictionnaire intérieur et sessioningvar code> est la valeur de chaîne du dictionnaire interne? p>

essentiellement, comment puis-je transférer ceci: p> xxx pré>

à ceci (pseudo c # juste Pour la visualiser) P>

objList[0] = SomeObject { var1 = 0, var2 = 0, someStringVar = "foo" }
objList[1] = SomeObject { var1 = 0, var2 = 1, someStringVar = "bar" }
objList[2] = SomeObject { var1 = 0, var2 = 2, someStringVar = "foo1" }
objList[3] = SomeObject { var1 = 1, var2 = 0, someStringVar = "bar1" }
objList[4] = SomeObject { var1 = 1, var2 = 1, someStringVar = "foo2" }
objList[5] = SomeObject { var1 = 1, var2 = 2, someStringVar = "bar2" }


0 commentaires

4 Réponses :


9
votes

Cela devrait fonctionner:

var flattened =
from kvpOuter in nestedDictionary
from kvpInner in kvpOuter.Value
select new SomeObject()
{
    var1 = kvpOuter.Key,
    var2 = kvpInner.Key,
    someStringVar = kvpInner.Value
};
var list = flattened.ToList(); // if you need a list...


9 commentaires

@ Timschmelter: génial! Merci tim :)


On dirait que je tente juste de surcharger des choses lorsque vous travaillez avec Linq ... je n'ai tout simplement pas pu voir une solution aussi simple. Merci :)


Merci!!! Wow, j'étais prêt à me frapper la tête contre le mur, mais maintenant tout semble bien et que je peux continuer à coder pour toujours!


Comment allez-vous cela en utilisant Linq si vous vouliez simplement que le dictionnaire imbriqué soit renvoyé comme une liste? Sans l'initialisateur d'objet?


@Jwiley: Voulez-vous transformer chaque dictionnaire imbriqué dans une liste (alors obtenez enfin une liste de listes) ou vous souhaitez obtenir une liste finale contenant toutes les valeurs clés du dictionnaire intérieur? Vous ne pouvez pas simplement supprimer l'initialiseur d'objet du code ci-dessus, vous devez renvoyer quelque chose pour chaque élément de dictionnaire intérieur (E.g. kvpinner) ...


Liste des listes, j'ai fini par faire .values.selectmany (x => x) .tolist () . Y a-t-il une meilleure façon?


@Jwiley: En fait, avec votre code, vous obtiendrez une liste des paires de clés, pas une liste de listes ...


Oh, comment pourrais-je modifier cela à la liste des listes? Je suis principalement préoccupé par la réception de Json


(Remarque: je vais abréger keyvaluepair avec kvp) néhitdic.values.select (x => x.toliste ()). Tolist () créera une liste > , mais si vous souhaitez inclure également les touches de dictionnaire externe: Néhitdict.select (x => nouveau kvp >> (x.key, x.value.toliste ()))) Toliste () . BTW, JSON.NET Bibliothèque peut sérialiser / désérialiser le dictionnaire imbriqué sans aucun problème ...



11
votes

Vous pouvez utiliser SelectMany () et écrire quelque chose comme: < Pré> xxx


2 commentaires

+1 SelectMany est où j'ai tendance à utiliser la syntaxe de requête (si possible), ne sais pas pourquoi. Si elle est formatée si bien, la syntaxe de la méthode est tout aussi bien lisible (en C # contrairement à VB).


@Im, pas qu'il y ait quelque chose de mal avec ça :) J'en ai effectivement choisi la syntaxe de la méthode en raison de l'appel de Tolist () à la fin (je n'aime pas mélanger la syntaxe de la requête avec une méthode finale raison).



1
votes

Ceci vous donnera une énorme iEnumerable : xxx

appel résultats.tolist ou ou . Toarray pour obtenir une liste d'une liste ou TOOOObject [] respectivement.


0 commentaires

0
votes
var xxx = nestedDictionary.SelectMany(
                    kvp =>
                    kvp.Value.Select(
                        xx => new SomeObject() {var1 = kvp.Key, var2 = xx.Key, someStringVar = xx.Value}));

0 commentaires