【问题标题】:How can I get running totals of integer values from a SortedDictionary?如何从 SortedDictionary 获取整数值的运行总计?
【发布时间】:2011-01-17 14:34:37
【问题描述】:
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>

【问题讨论】:

  • 必须是 LINQ 吗?或者您只是对获得结果感到满意?
  • 我仍然对typeDictionary 的来源感到非常困惑。一个简短但完整的示例确实会有所帮助 - 一如既往。
  • 不要考虑 typeDictionary...
  • Linq 将优先考虑其他逻辑解决方案。
  • @User "不考虑 typeDictionary。" ...那么它不应该出现在您的问题中。

标签: c# sorting dictionary sum


【解决方案1】:
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};
                           });

【讨论】:

  • +1 我修改了您的答案以使返回类型为Dictionary&lt;int,int&gt;。希望你不介意:)
  • 从 Dictionary 返回项目的顺序未定义,可能不是 user578083 正在寻找的。​​span>
  • @Jonas Elfstrom,lengthDictionary 不是字典
【解决方案2】:

如果你需要一个查询而不一定是一个新的排序字典,你可以构造这样的东西。

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

【讨论】:

    【解决方案3】:

    这是我的方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多