Maison  >  Article  >  développement back-end  >  .NET Framework - Explication détaillée du code technique « regroupement » dans les collections et LINQ

.NET Framework - Explication détaillée du code technique « regroupement » dans les collections et LINQ

黄舟
黄舟original
2017-03-18 13:13:281586parcourir

Nous regroupons souvent selon un ou plusieurs attributs individuels dans une collection de mémoire, telle que Liste, et affichons des statistiques. La façon la plus simple de penser est de parcourir l'instance List en fonction d'un certain attribut clé et de la convertir dans le type de dictionnaire suivant

Dictionary<string, List<MyObject>

Par exemple, des voitures données,

                List<Car> cars = new List<Car>(){                
                new Car(1,"audiA6","private"),                
                new Car(2,"futon","merchant"),                
                new Car(3,"feiren","bike"),                
                new Car(4,"bukon","private"),                
                new Car(5,"baoma","private"),                
                new Car(6,"dayun","merchant")
            };

Je voudrais utiliser id est la clé et la valeur est Car, qui est convertie en dictionnaire idCarDict En plus de parcourir cette méthode, qui a la logique la plus compliquée et nécessite le plus de code, nous pouvons également utiliser directement la méthode ToDictionary,

ar idCarDict = cars.ToDictionary(car=>car.id);

Cependant, cette méthode est limitée, il ne peut y avoir qu'une seule instance de l' objet correspondant au code clé, c'est-à-dire que le type renvoyé est

Dictionary<string,Object>

. C'est mauvais, car un code clé peut correspondre à plusieurs instances, à ce stade, vous devez d'abord utiliser GroupBy pour regrouper par code clé, puis le convertir en dictionnaire.

Par exemple, nous voulons utiliser le type comme clé pour obtenir plusieurs voitures sous ce modèle

Dictionary<string, List<Car>> typeCarDict = 
cars.GroupBy(car => car.type).
ToDictionary(g => g.Key, g => g.ToList());

Ce code de conversion est simple et bien meilleur que la logique de traversée suivante !

var dict = new Dictionary<string,List<Car>>();foreach(var car in cars)
{  if(dict.Contains(car.type))
     dict[car.type].Add(car);
  else
    dict.Add(car.type,new List<Car>(){car}));}

Cela résout le problème d'un code clé correspondant à plusieurs instances. Ensuite, selon le problème de plusieurs codes clés correspondant à plusieurs instances, cela peut-il être réalisé à l'aide de GroupBy sur la liste ? Impossible à réaliser.

À ce stade, vous devez écrire une instruction Linq pour combiner plusieurs codes clés dans un nouvel objet

new {key1, key2, ...}

À titre d'exemple, nous avons un tel ensemble d'éléments dans le. set est un objet ValPair, cet objet contient deux éléments entiers, Val1 est le plus petit et Val2 est relativement plus grand. Comment regrouper selon la combinaison de Val1 et Val2 ?
Veuillez consulter la logique suivante :

        static void printfDuplicateCompare(List<ValPair> compares)
        {            //按组合键分组后,每组元素个数大于2的分组,按降序排序
            var rtnByVal1 = from item in compares                            
            group item by new { item.Val1, item.Val2 }                                
            into g                                
            where g.Count()>1
                                orderby g.Count() descending
                                select g;            //按Val1和Val2组合为字典键,元素个数为值
            var dict = rtnByVal1.ToDictionary(g => g.Key,g=>g.Count());
        }

Résumé

Le GroupBy de la liste ne peut être regroupé que par une seule touche. Si vous devez regrouper par plusieurs combinaisons de touches, vous devez écrire un. Combinaison d'instructions Linq.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn