Как добавить промежуточные итоги без LINQ - PullRequest
0 голосов
/ 16 ноября 2018

Я работаю в месте, где все внутренние клиенты имеют старую версию .NET, поэтому мне нужно обойтись без LINQ. Я пытаюсь достичь чего-то довольно простого. Список моего класса выглядит так:

List<TestClass> list = new List<TestClass>()
             {
                 new TestClass(){ ThisName= "A", ThisNumber = 12},
                 new TestClass(){ ThisName= "B", ThisNumber = 4},
                 new TestClass(){ ThisName= "A", ThisNumber = 7},
                 new TestClass(){ ThisName= "C", ThisNumber = 14},
                 new TestClass(){ ThisName= "C", ThisNumber = 13},
                 new TestClass(){ ThisName= "B", ThisNumber = 10},
                 new TestClass(){ ThisName= "B", ThisNumber = 8},
                 new TestClass(){ ThisName= "C", ThisNumber = 16},
                 new TestClass(){ ThisName= "A", ThisNumber = 17},
                 new TestClass(){ ThisName= "B", ThisNumber = 11},
             };
             return list;

и конечный результат должен выглядеть следующим образом:

A   36
B   33
C   43

с LINQ Я бы просто написал этот код:

Dictionary<string, int> dict = source.GroupBy(x => x.ThisName).Select(g => new {Key = g.Key, Value = g.Sum( h => h.ThisNumber)}).ToDictionary(g => g.Key, g => g.Value);

НО, я должен добиться того же самого без LINQ.

Заранее спасибо за любую идею.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Просто перечислите свою коллекцию и сумму на ходу.

TryGetValue доступен с .Net 2.0.

var results = new Dictionary<string, int>();

foreach (var item in list)
{
    int total = 0;
    if (results.TryGetValue(item.ThisName, out total))
    {
        results[item.ThisName] = total + item.ThisNumber;
    }
    else
    {
        results.Add(item.ThisName, item.ThisNumber);
    }
}
0 голосов
/ 16 ноября 2018

Без Linq вы можете просто создать свой словарь авансом и суммировать количества в foreach:

Dictionary<string, int> sumDict = new Dictionary<string, int>();
foreach (var item in list) {
    if (!sumDict.ContainsKey(item.ThisName)) {
        sumDict.Add(item.ThisName, 0);
    }
    sumDict[item.ThisName] += item.ThisNumber;
}
...