Inverser dictionnaire plusieurs-plusieurs <clé, Liste >

En fait, ma question précédente m’a fait réfléchir et j’ai compris qu’inverser un Dictionary n’était pas anodin. Quelle est la manière la plus élégante et la plus lisible de le faire?

Même scénario étudiant Plusieurs à plusieurs avec des classes

original Dicitonary<int, List> où la clé est studentId et la valeur est une List qui contient classId et que vous souhaitez rétablir dans le Dictionary<classId, List>

Merci

Mise à jour: En fait, je viens juste de tester les solutions de Luke et Bruno et elles renvoient la bonne quantité de personnes classées, qu’elles aient toutes le même étudiant, seront mises à jour au fur et à mesure.

Façon légèrement différente (un peu plus compréhensible pour mon cerveau quand même 🙂 … …

 var newDict = new Dictionary>(); var dict = new Dictionary>(); dict.Add( 1, new List() { 1, 2, 3, 4, 5 } ); dict.Add( 2, new List() { 1, 2, 3, 4, 5 } ); dict.Add( 3, new List() { 1, 2, 6 } ); dict.Add( 4, new List() { 1, 6, 7 } ); dict.Add( 5, new List() { 8 } ); var newKeys = dict.Values.SelectMany( v => v ).Distinct(); foreach( var nk in newKeys ) { var vals = dict.Keys.Where( k => dict[k].Contains(nk) ); newDict.Add( nk, vals.ToList() ); } 

Inverser un dictionnaire est très facile:

 var newDic = oldDic.ToDictionary(x => x.Value, x => x.Key); 

C’est tout.

Maintenant, votre question est différente. Il s’agit d’inverser une relation plusieurs à plusieurs, établie sur un dictionnaire.

Donc, disons que vous avez Dictionary >. L’idée est d’en extraire la “table du milieu” de la relation plusieurs à plusieurs. Ensuite, vous pouvez le regrouper de l’autre côté et le retransformer en dictionnaire.

Pour la première partie, nous allons utiliser la surcharge de SelectMany qui

“Projete chaque élément d’une séquence sur un IEnumerable , aplatit les séquences résultantes en une seule séquence et appelle une fonction de sélecteur de résultat sur chaque élément de celle-ci.”

 var table = dict.SelectMany( x => x.Value, (dictEntry, entryElement) => new { Entity1 = dictEntry.Key, Entity2 = entryElement } ); 

Donc, maintenant, il vous suffit de regrouper ce tableau comme vous le souhaitez, puis de le convertir en dictionnaire.

  var newDict = table .GroupBy(x => x.Entity2, x => x.Entity1, (entity2, entity1) => new {entity1, entity2}) .ToDictionary(x => x.entity2, x => x.entity1); 

Je ne sais pas exactement en quoi cela diffère de votre question précédente .

Si vous demandez simplement comment renvoyer un Dictionary> plutôt que Dictionary> tout ce dont vous avez besoin est un appel à la méthode ToList .

Voler et modifier la réponse de Mehrdad à votre autre question :

 var classToStudent = studentToClass .SelectMany( pair => pair.Value.Select(val => new { Key = val, Value = pair.Key })) .GroupBy(item => item.Key) .ToDictionary(gr => gr.Key, gr => gr.Select(item => item.Value).ToList());