it-swarm.com.de

Holen Sie sich die Summe des Wertes aus der Liste mit linq?

Ich versuche, die Summe des Werts aus der Liste der Liste mit Hilfe von linq abzurufen. Meine Daten sind wie folgt 

        List<List<string>> allData = new List<List<string>>();
        using (StreamReader reader = new StreamReader(path))
        {
            while (!reader.EndOfStream)
            {
                List<string> dataList;
                dataList = reader.ReadLine().Split('|').ToList();
                allData.Add(dataList);
            }
        }

was gibt mir Daten in allData wie unten 

           allData-->[0]-->[0]-'name1'
                           [1]-'sub'
                           [2]-'12'
                     [1]-->[0]-'name2'
                           [1]-'sub'
                           [2]-'15'  
                     [2]-->[0]-'name1'
                           [1]-'sub2'
                           [2]-'15'
    //and so on ....

ich habe eine Gruppe angewendet, die mir eine Gruppierung nach dem Namen gibt, aber ich bin nicht in der Lage, die Summe der Noten für jeden Namen zu ermitteln.

      var grouped = allData.GroupBy(x => x[0]);

danach bekomme ich alle passenden Namen in einem gruppiert, aber wie erhält man die Summe der Noten für diese Gruppe? jede hilfe wäre toll?

  Output should be  name1=27 and name2=15 and so on.
9
user2721874
var grouped = allData.GroupBy(x => x[0])
                     .Select(g => new
                     {
                         Name = g.Key,
                         Sum = g.Sum(x => int.Parse(x[2]))
                     });

Es wird für jede Gruppe eine anonyme Typinstanz mit zwei Eigenschaften zurückgegeben: Name mit Ihrem Gruppierungsschlüssel und Sum mit Summe der Markierungen.

7
MarcinJuraszek

Nicht sicher, ob Sie die Summe jeder Gruppe oder die Summe erhalten möchten. Wenn es die Summe ist, sollte dies den Trick tun

var sum = allData.Sum(x => Int32.Parse(x[2]));

Wenn es sich um einen Schlüssel handelt, versuchen Sie Folgendes

var all = allData
  .GroupBy(x => x[0])
  .Select(x => x.Sum(y => Int32.Parse(y[2]));
18
JaredPar

Dadurch erhalten Sie eine parallele Liste mit jedem Namen und der Anzahl, wie oft ein Name auftritt.

    var names = grouped.Select(s => s.Key).ToList();
    var nameCount = grouped.Select(s => s.Count()).ToList();

Außerdem ... können Sie dies hinzufügen, wenn Sie alle Daten gruppiert zuweisen. Ich verwende dies, um eine Liste von der größten bis zur geringsten Anzahl von Vorkommen zu erhalten.

    var grouped = allData.GroupBy(x => x[0]).OrderByDescending(i => i.Count());
0
JustSomeDude

So viel wie möglich zur Abfragesprache LINQ halten:

var grouped = from d in allData
              group d by i[0] into g
              select new
              {
                  Name = g.Key,
                  Sum = g.Sum(i => int.Parse(i[2]))
              };
0
Paulo Morgado