我有一个对象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结构时,我需要编辑函数,并且存在着风险。忘记在某处更新它。
答案 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