Comment puis-je aplaticez un dictionnaire imbriqué dans une liste de certains objets ( Par exemple: Dictionnaire a dicté Suivi de type p> alors, ayons cette classe p> comment puis-je convertir essentiellement, comment puis-je transférer ceci: p> à ceci (pseudo c # juste Pour la visualiser) P> ToNOObject code> dans l'exemple suivant) qui devrait contenir des touches de ces dictionnaires? NuShictionary code> à une liste 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> 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" }
4 Réponses :
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...
@ 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 () code>. 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 () code> créera une liste > code>, mais si vous souhaitez inclure également les touches de dictionnaire externe:
Néhitdict.select (x => nouveau kvp
Vous pouvez utiliser SelectMany () et écrire quelque chose comme: < Pré> xxx pré> p>
+1 SelectMany code> 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 () code> à la fin (je n'aime pas mélanger la syntaxe de la requête avec une méthode finale raison).
Ceci vous donnera une énorme appel iEnumerable résultats.tolist code> ou ou . Toarray code> pour obtenir une liste d'une liste TOOOObject [] code> respectivement. P> p>
var xxx = nestedDictionary.SelectMany(
kvp =>
kvp.Value.Select(
xx => new SomeObject() {var1 = kvp.Key, var2 = xx.Key, someStringVar = xx.Value}));