2
votes

Pourchaque éléments de groupe à partir d'une liste d'objets

J'ai besoin de regrouper une grande liste d'éléments selon un certain attribut. Est-il possible en C # de faire un foreach avec une clause «where» dans une liste d'objets ou y a-t-il un meilleur moyen? Par exemple, j'ai 5000 enregistrements et 3 groupes qui les séparent.

Foreach list.item where item.group = group1{
do action one for every record from group1
}

et ainsi de suite ... ps .: J'ai déjà les enregistrements à ce stade du code, donc je ne pense pas que Linq aiderait.


3 commentaires

Avez-vous même besoin de regrouper les éléments? Mb simplement foreach (var i dans les éléments) if (i.CertainAttribute == 1) ... else if (i.CertainAttribute == 2) ...


oui, le nombre de groupes peut varier et peut être important, ce ne serait pas cool de nombreux cas «si» ou «si». De plus, si je les ai tous classés, cela améliorerait la connexion et le serveur. J'ai déjà une solution, mais je ne pense pas que ce soit la meilleure.


Que voulez-vous dire par «Je ne pense pas que Linq aiderait»? Linq a la méthode OrderBy que vous pouvez utiliser pour regrouper tous les résultats selon les propriétés de votre choix.


3 Réponses :


0
votes

Ce modèle de base devrait faire ce dont vous avez besoin. Vous pouvez également utiliser un dictionnaire pour mapper les groupes.

using System.Linq; 

class Program
{
    class Item
    {
        public int Key { get; set; }
        public string Name { get; set; }
    }

    static void Main(string[] args)
    {
        var actions = new Dictionary<int, Action<Item>> {
            { 1, Action1 },
            { 2, Action2 },
            { 3, Action3 }
        };

        var items = new List<Item>();

        foreach (var group in items.GroupBy(x => x.Key))
        {
            var action = actions[group.Key];
            foreach (var item in group)
            {
                action(item);
            }
        }
    }

    static void Action1(Item item)
    {

    }

    static void Action2(Item item)
    {

    }

    static void Action3(Item item)
    {

    }
}


1 commentaires

"... J'ai déjà les enregistrements à ce stade du code donc je ne pense pas que Linq aiderait ...." => répond avec LINQ :)



2
votes

Vous pouvez séparer une liste plus grande en plus petites, basées sur une propriété, en utilisant ToLookup . La méthode ToLookup produira un dictionnaire de listes, où la clé est la valeur de propriété par laquelle vous les séparez et la liste contient tous les éléments qui correspondent.

Par exemple, si vos objets avoir un CategoryID , vous pouvez les séparer dans un dictionnaire de listes comme celui-ci:

foreach (var bucket in smallLists)
{
    Console.WriteLine("Bucket:");
    foreach (var item in bucket)
    {
        Console.WriteLine("Item {0} with category {1}", item.Name, item.CategoryID);
    }
}

Vous pouvez ensuite les itérer comme ceci:

XXX

Voir un exemple de travail sur DotNetFiddle .

p >


1 commentaires

c'est super. Je vais essayer ceci et je vous ferai savoir si cela a fonctionné dans mon cas.



0
votes

Je pense que vous voulez faire est de regrouper les éléments de la liste par un groupe, puis de créer une autre liste avec chaque groupe et ses éléments.

Si tel est le cas, vous pouvez faire quelque chose comme ceci: p >

var grouped = items/*.Where(c => c.group == //desired group if want's to filter//)*/
     .GroupBy(c => c.group);
var results = grouped.Select(c => new {
     Group = c.Key.group,
     Items = c.Select(c => new { c.PropertyOfItem1, c.PropertyOfItem2, // etc // })
});


0 commentaires