6 Stimmen

Das Summieren von Werten über verschachtelten Listen an jedem Index

Ich habe eine List> namens _DataCollection, in der jede der verschachtelten Listen eine gleiche Anzahl von Werten hat. Obwohl alle Zeichenfolgen sind, bestehen die Werte in den verschachtelten Listen aus alphanumerischen Zeichen, leeren Zeichenfolgen oder einem Währungswert. Zum Beispiel

_DataCollection[0] = {"tom", "abc", "$525.34", "$123"}
_DataCollection[1] = {"dick", "xyz", "$100", "$234"}
_DataCollection[2] = {"harry", "", "$250.01", "$40"}
_DataCollection[2] = {"bob", "", "$250.01", ""}

Was ich tun muss, ist eine Möglichkeit zu finden, alle Werte pro Index über alle verschachtelten Listen zu summieren und dies einer Liste hinzuzufügen:

newSumList[0] = "N/A", da "tom" + "dick" + "harry" + "bob" nicht zusammengefasst werden können.
newSumList[1] = "N/A", da "abc" + "xyz" + "" + "" nicht zusammengefasst werden können.
newSumList[2] = "1125.36"
newSumList[3] = "397", auch wenn der letzte Wert der letzten verschachtelten Liste "" ist.

Grundsätzlich alle numerischen Werte in verschachtelten Listen für jeden Index zusammenzählen.

Der einzige Weg, den ich kenne, um dies zu tun, ist, diese durchlaufen und einen laufenden Gesamtbetrag behalten, aber ich frage mich, ob ich dies mit LINQ oder etwas anderem tun kann.

0voto

Firo Punkte 29738

Ohne mehrfaches Iterieren und Unterstützung leerer Quelllisten

var list = new List
{
    new [] {"tom", "abc", "$525.34", "$123"},
    new [] {"dick", "xyz", "$100", "$234"},
    new [] {"harry", "", "$250.01", "$40"},
    new [] {"bob", "", "$250.01", ""}
};
var cutlure = new CultureInfo("en-US");
var result = list.Aggregate((decimal[])null, (sums, strings) =>
    {
        if (sums == null)
            sums = Enumerable.Repeat(decimal.MinValue, strings.Length).ToArray();
        for (int i = 0; i < strings.Length; i++)
        {
            decimal value;
            if (decimal.TryParse(strings[i], NumberStyles.Currency, cutlure, out value))
                sums[i] = (sums[i] == decimal.MinValue) ? value : sums[i] + value;
        }
        return sums;
    },
    sums => sums.Select(sum => (sum == decimal.MinValue) ? "N/A" : sum.ToString()).ToArray());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X