在课堂上制定特定的分组方法

时间:2019-01-31 08:18:32

标签: c# linq methods

我有一个对象void Sample(){ AAA(); if(true) { BBB(); } ,其结构如下:

<Repere>

当我想按其名称对class Repere { public string Name { get; set; } public List<Operation> Operations { get; set; } public int Quantite {get;set;} ... } 进行分组时,我总是使用以下分组方法:

List<Repere>

我喜欢做的是在类Repere中添加类似的方法

List<Repere> liste_rep_group = liste_rep.GroupBy(l => l.Name)
    .Select(cl => new Repere
    {
        Quantite = cl.Sum(c => c.TotalQuantity),
        TotalQuantity = cl.Sum(c => c.TotalQuantity),
        ID = -1,
        IdAff = cl.First().IdAff,
        Name = cl.First().Name,
        NameOri = cl.First().Name,
        Nom_aff = cl.First().Nom_aff,
        Profil = cl.First().Profil,
        Longueur = cl.First().Longueur,
        Hauteur = cl.First().Hauteur,
        Largeur = cl.First().Largeur,
        Poids = cl.First().Poids,
        Priorite = cl.Min(c => c.Priorite),
        Matiere = cl.First().Matiere,
        Angle1 = cl.First().Angle1,
        Angle2 = cl.First().Angle2,
        AngleAile1 = cl.First().AngleAile1,
        AngleAile2 = cl.First().AngleAile2,
        GroupeProfil = cl.First().GroupeProfil,
        ListOperations = (cl.SelectMany(g=>g.ListOperations).GroupBy(o=>o.ID)
            .Select(go => new Operation
                {
                    ID = go.First().ID,
                    QtyFinished = go.Sum(o => o.QtyFinished),
                    Color=go.First().Color,
                })).ToList()
        ...
    }).ToList();

因此,每次我需要对public List<Repere> GroupByName(List<Repere>) { //My grouping method } 进行分组时,都不需要在所有地方复制所有函数。主要原因是当我修改Repere结构时,我需要编辑函数,并且存在着风险。忘记在某处更新它。

1 个答案:

答案 0 :(得分:1)

您可以在List<Repere>上编写扩展方法以实现预期的行为。

public static class ListRepereExtensionMethods
{
    public static List<Repere> GroupByName(this List<Repere> liste_rep)
    {
        List<Repere> liste_rep_group = liste_rep.GroupBy(l => l.Name)
            .Select(cl => new Repere
            {
                Quantite = cl.Sum(c => c.TotalQuantity),
                TotalQuantity = cl.Sum(c => c.TotalQuantity),
                ID = -1,
                IdAff = cl.First().IdAff,
                Name = cl.First().Name,
                NameOri = cl.First().Name,
                Nom_aff = cl.First().Nom_aff,
                Profil = cl.First().Profil,
                Longueur = cl.First().Longueur,
                Hauteur = cl.First().Hauteur,
                Largeur = cl.First().Largeur,
                Poids = cl.First().Poids,
                Priorite = cl.Min(c => c.Priorite),
                Matiere = cl.First().Matiere,
                Angle1 = cl.First().Angle1,
                Angle2 = cl.First().Angle2,
                AngleAile1 = cl.First().AngleAile1,
                AngleAile2 = cl.First().AngleAile2,
                GroupeProfil = cl.First().GroupeProfil,
                ListOperations = (cl.SelectMany(g=>g.ListOperations).GroupBy(o=>o.ID)
                    .Select(go => new Operation
                        {
                            ID = go.First().ID,
                            QtyFinished = go.Sum(o => o.QtyFinished),
                            Color=go.First().Color,
                        })).ToList()
                ...
            }).ToList();
    }
}

使用上述扩展方法时,您可以调用类似方法

List<Repere> liste_rep_group = liste_rep.GroupByName();

您也可以选择将其实现为静态Utility类。在这种情况下,您将从方法的参数部分删除this,并像

一样调用方法

List<Repere> liste_rep_group = ListRepereExtensionMethods.GroupByName(liste_rep);

有关此方法的优缺点的一些讨论可在 Extension Methods vs Static Utility Class evaluating cost/benefits of using extension methods in C# => 3.0