使用linq对List <int>进行分组和汇总(Zip?)

时间:2017-12-30 20:17:15

标签: c# linq

我有一个我要分组的对象列表。 对象有一个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;
                    }
                }

1 个答案:

答案 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();