Как я могу получить промежуточные итоговые значения из SortedDictionary? - PullRequest
0 голосов
/ 17 января 2011
SortedDictionary<int, string> typeDictionary = new SortedDictionary<int, string>(); 
SortedDictionary<int, int> lengthDictionary = new SortedDictionary<int, int>();

lengthDictionary имеет значения в паре ключ-значение следующим образом:

<1,20>
<2,8>
<3,10>
<4,5>

я хочу запрос LINQ, который вернет мне новый список, как показано ниже

<1,20>
<2,20+8=28>  // 20 from key 1
<3,28+10=38> // 28 from key 2
<4,38+5=43>  // 38 from key 3

Результат должен выглядеть так:

<1,20>
<2,28>
<3,38>
<4,43>

Ответы [ 3 ]

2 голосов
/ 17 января 2011
int tempTotal = 0;
Dictionary<int, int> result = lengthDictionary.ToDictionary(p => p.Key, p =>
                                                 {
                                                      tempTotal += p.Value;
                                                      return tempTotal;
                                                 });

ПРИМЕЧАНИЕ: не проверено. Кроме того, вы можете изменить тип проекции.

Редактировать: вот мой оригинальный ответ, если вы хотите упорядоченный результат:

int runningTotal = 0;
lengthDictionary.Select(p => 
                          {
                              runningTotal += p.Value; 
                              return new {Key = p.Key, Value = runningTotal};
                           });
0 голосов
/ 17 января 2011

Вот мой подход:

SortedDictionary<int, int> dictionary = new SortedDictionary<int, int>()
                                            {
                                                {1, 20},
                                                {2, 8},
                                                {3, 10},
                                                {4, 5}
                                            };


var result = Enumerable
    .Range(0, dictionary.Keys.Count)
    .Select(i => new
                        {
                            Key = dictionary.Keys.Skip(i).First(),
                            Value = dictionary.Take(i+1).Select(k => k.Value).Sum()
                        })
    .ToDictionary(k => k.Key, v => v.Value);



foreach(var r in result)
{
    Console.WriteLine("Key = {0}, Value = {1}", r.Key, r.Value);
}


Console.WriteLine("done");

Console.ReadLine();
0 голосов
/ 17 января 2011

Если вам нужен запрос, а не обязательно новый отсортированный словарь, вы можете создать что-то вроде этого.

int runningSum = 0;
var query = (from pair in lengthDictionary
            let innerSum = (runningSum += pair.Value)
            select new
            {
                Key = pair.Key,
                Value = innerSum 
            });

// make a new SortedDictionary?
var newDictionary = new SortedDictionary<int, int>(query.ToDictionary(pair => pair.Key, pair => pair.Value));

// display to confirm result
foreach (var pair in newDictionary)
    Console.WriteLine("{0}\t{1}", pair.Key, pair.Value);

Примечание: Ответ без LINQ может быть проще,особенно если вы хотите новый словарь в качестве вывода.

var newDictionary = new SortedDictionary<int, int>();
int runningTotal = 0;
foreach (var pair in lengthDictionary)
{
    runningTotal += pair.Value;
    newDictionary.Add(pair.Key, runningTotal);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...