我有一个我要分组的对象列表。 对象有一个List参数,在分组过程中我想要像这样列出总和:
for(int i=0;i<MyList1.Count();i++)
{
StatutOperations[i]=StatutOperations1[i]+StatutOperations2[i]...
}
现在使用linq我有以下内容:
liste_rep = liste_rep.GroupBy(l => l.Nom)
.Select(cl => new Repere
{
Quantite = cl.Sum(c => c.Quantite),
IdAff = cl.First().IdAff,
ID = 0,
ListeOperations = cl.First().ListeOperations,
StatutOperations = cl.Zip(StatutOperations)//First().StatutOperations
}).ToList();
线路制作问题是最后一个,我找到了如何使用Zip函数来汇总两个表,但是如果我想使用它来分组列表呢?
编辑:StatusOperations是一个整数列表,具体来说,liste_rep是一个详细信息列表,详细信息包含n个操作的列表,StatusOperations确定每个操作的操作细节。
示例: ListOperations = CUT,DRILL,PAINT StatusOperations = 20,20,10
这意味着切割了20个细节,钻了20个,涂了10个 我想将每个操作的详细信息列表分组。
编辑2:
现在我只能设法让自己成为分组:
liste_rep = liste_rep.OrderBy(p => p.Nom).ToList();
if (liste_rep.Count()>1)
{
totalStatut = liste_rep[0].StatutOperations.ConvertAll(s => s = 0);
string oldRep = "";
Repere repere = new Repere();
foreach (Repere rep in liste_rep)
{
if (rep.Nom!=oldRep)
{
newListRep.Add(repere);
repere = new Repere();
repere.Nom = rep.Nom;
repere.StatutOperations = rep.StatutOperations;
}
else
{
repere.StatutOperations=repere.StatutOperations.Zip(rep.StatutOperations, (x, y) => x + y).ToList();
}
oldRep = rep.Nom;
}
}
答案 0 :(得分:2)
您可以使用此
如果StatutOperations是int的列表。
在最后一行使用此功能。
StatutOperations = cl.Aggregate((opl1,opl2)=&gt;
{return opl1.StatutOperations.Zip(opl2.StatutOperations,(opin1,opin2)=&gt; opin1 + opin2).ToList(); });
在上面的代码中,Aggregate运行两个元素并聚合为sum(op1 + op2)。
注意:当且仅当列表包含多个元素时,请记住使用聚合 。 编辑: 抱歉,上面的代码不正确,因为这是在repere类型对象上应用聚合,因此预期的返回值将是Repere类型。
现在编辑我的代码它应该可以正常工作。
liste_rep.GroupBy(l => l.Nom)
.Select(cl => new Repere
{
Quantite = cl.Sum(c => c.Quantite),
IdAff = cl.First().IdAff,
ID = 0,
ListeOperations = cl.First().ListeOperations,
StatutOperations = cl
.Select(x=>x.StatutOperations)
.Aggregate((x,y)=> x.Zip(y,(p,q)=>p+q).ToList());
}).ToList();