2017-12-30 18 views
0

Ich habe eine Liste von Objekten, die ich gruppieren möchte. Objekte haben eine Liste Parameter, und während die Gruppierung möchte ich die Summe der Listen wie diese machen:Verwenden von Linq zu gruppieren und Summe Liste <int> (Zip?)

for(int i=0;i<MyList1.Count();i++) 
{ 
StatutOperations[i]=StatutOperations1[i]+StatutOperations2[i]... 
} 

Vorerst Linq verwenden Ich habe folgendes:

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

Die Linie machen Problem ist, der letzte, ich habe gefunden, wie man Zip-Funktion verwendet, um zwei Tabellen summieren, aber was, wenn ich es verwenden möchte, gruppiert Listen?

Bearbeiten: StatusOperations ist eine Liste von Ganzzahlen, konkret liste_rep ist eine Liste von Details, Details haben eine Liste von n Operationen, und StatusOperations bestimmt, wie viele Details für jede Operation betrieben wurden.

Beispiel: ListOperations = schneiden, bohren, PAINT StatusOperations = 20,20,10

Das bedeutet 20 Details geschnitten werden, 20 sind gebohrt und 10 sind bemalt ich gruppieren möchten die Liste der Details bekommen Summen für jede Operation.

Edit 2:

Vorerst nur ich es macht mir die Gruppierung zu tun gelänge:

   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

Bitte erläutern Sie, was 'StatutOperations' ist. Zeigen Sie einige Beispieldaten der verschiedenen Tabellen und der gewünschten Ausgabe an. 'Zip' wird verwendet, um zwei Sammlungen nach dem Index des Artikels zu verbinden - zuerst mit der ersten, Sekunde mit der zweiten ... –

+0

Welchen Fehler bekommen Sie? – derloopkat

+0

Gilad Green Ich habe den Beitrag bearbeitet, derloopkat Ich habe noch keine Fehlermeldung, da ich es nicht geschafft habe, die gute Syntax dafür zu bekommen. –

Antwort

1

Sie diesen

wenn StatutOperations eine Liste von int verwenden kann).

Verwenden Sie dies in der letzten Zeile. StatutOperations = cl.Aggregate ((opl1, opl2) =>
{Zurück opl1.StatutOperations.Zip (opl2.StatutOperations, (opin1, opin2) => Meinung1 + Meinung2) .ToList();});

im obigen Code Aggregat läuft durch zwei Elemente und aggregiert als Summe (op1 + op2).

Hinweis: Denken Sie daran, Aggregat nur zu verwenden, wenn die Liste mehr als ein Element enthält . Edit: Sorry der obige Code ist falsch, da dies Aggregat auf Repere Typ Objekt anwendet und daher der erwartete Rückgabewert Repere Typ wäre.

Bearbeitete meinen Code jetzt sollte es jetzt gut funktionieren.

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(); 
+0

Hallo, danke für die Antwort, aber nicht funktioniert, ich habe zwei Fehler 1) Kann nicht konvertieren Liste Repere (es ist mein Objekt), 2) kann nicht konvertieren Lambda-Ausdruck. Zur Information kann meine Liste 1 bis hunderte Elemente enthalten (normalerweise mehrere, aber es kann vorkommen, dass es nur ein Element gibt). –

+0

Hallo für ein Element können Sie es direkt zuweisen wie mit 0 Index –

+0

Auch Sie hinzugefügt bearbeiten 2 ist es jetzt funktioniert. –

Verwandte Themen