0 votes

Requête Linq

Je suis un grand naïf avec Linq et j'essaie d'apprendre, mais je me heurte à un point de blocage ici. J'ai une structure de type :

Dictionary<MyType, List<MyObj>>

J'aimerais interroger cette structure avec Linq pour extraire toutes les instances de MyObj qui apparaissent dans plus d'une liste du dictionnaire.

À quoi ressemblerait une telle requête ?

Gracias.

3voto

Bryan Watts Points 22810
from myObjectList in myObjectDictionary.Values
from myObject in myObjectList.Distinct()
group myObject by myObject into myObjectGroup
where myObjectGroup.Skip(1).Any()
select myObjectGroup.Key

En Distinct() sur chaque liste garantit MyObj les cas qui se répètent uniquement dans la même liste ne sont pas signalés.

1voto

rmoore Points 9561

Vous pourriez faire quelque chose comme ça :

var multipleObjs =
    MyObjDictionary.Values // Aggrigate all the List<MyObj> values into a single list
        .SelectMany(list => list) // Aggrigate all the MyObjs from each List<MyObj> into a single IEnumerable
        .GroupBy(obj => obj) // Group by the Obj itself (Or an ID or unique property on them if it exists)
        .Where(group => group.Count() >= 2) // Filter out any group with less then 2 objects
        .Select(group => group.Key); // Re-Select the objects using the key.

Editer
J'ai réalisé que cela pouvait également être lu différemment, de telle sorte que cela n'a pas d'importance si le MyObj apparaît plusieurs fois dans la même liste, mais seulement s'il apparaît plusieurs fois dans différent listes. Dans ce cas, lors de l'agrégation initiale des listes de MyObjs, nous pouvons sélectionner Distinct values, ou utiliser une requête légèrement différente :

var multipleObjs =
    MyObjDictionary.Values // Aggrigate all the List<MyObj> values into a single list
        .SelectMany(v => v.Distinct()) // Aggrigate all distinct MyObjs from each List<MyObj> into a single IEnumerable
        .GroupBy(obj => obj) // Group by the Obj itself (Or an ID or unique property on them if it exists)
        .Where(group => group.Count() >= 2) // Filter out any group with less then 2 objects
        .Select(group => group.Key); // Re-Select the objects using the key.

var multipleObjs =
        MyObjDictionary.SelectMany(kvp => // Select from all the KeyValuePairs
            kvp.Value.Where(obj =>
                MyObjDictionary.Any(kvp2 => // Where any of the KeyValuePairs
                    (kvp.Key != kvp2.Key) // Is Not the current KeyValuePair
                    && kvp.Value.Contains(obj)))); // And also contains the same MyObj.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X