【问题标题】:Need Sum from multidimensional array using LINQ需要使用 LINQ 从多维数组中求和
【发布时间】:2011-10-18 19:36:01
【问题描述】:

我有以下代码:

var ccdata = dict1.Select(i => 
                          new object[] { i.Key, Int32.Parse(i.Value) }
                         ).ToArray();

我需要得到所有 i.Value 的总和。请注意,这是一个多维对象数组。 i.Key 是一个字符串值,i.Value 是一个需要求和的 int 值。

提前谢谢你

【问题讨论】:

  • 你为什么要把这两个放到一个对象数组中,从而把所有东西都装箱?
  • i.Value 是什么字符串?为什么解析它,为什么它最初不是一个数字?
  • 如果 I.Value 已经是一个 int 那么 int.Parse 将不会编译,因为它需要一个字符串。是字符串还是整数?
  • @JonSkeet:因为当他问how to create a multidimensional array 时,我建议用 Linq 来做。看起来他并没有费心去查找 Linq 的全部内容,并希望他从该站点获得的随机代码可以组合成一个可行的解决方案。

标签: c# .net linq multidimensional-array sum


【解决方案1】:
dic.Sum(i => Int32.Parse(i.Value)); // if i.Value is string instead of just int

dic.Sum(i => i.Value); // if string

ccdata.Sum(i => (int)i[1]); // if i[1] is object instead of just int

ccdata.Sum(i => i[1]); // if int

【讨论】:

  • 后者会编译失败,因为i[1]的编译时类型就是object
【解决方案2】:

目前还不清楚你为什么要这样做,但总结它们相当容易......

int sum = ccdata.Sum(x => (int) x[1]);

如果你使用它会更清晰,更高效:

var ccdata = dict1.Select(i => new { i.Key, Value = Int32.Parse(i.Value) })
                  .ToArray();

这样你最终会获得编译时类型安全并且没有装箱:

int sum = ccdata.Sum(x => x.Value);

(我假设您实际上出于其他原因需要 ccdata。否则,请使用 abatishchev 的解决方案并完全摆脱现有代码。)

【讨论】:

    【解决方案3】:

    i.Value 位于内部数组的第二个位置。 所以它应该是这样的:

    var sum = cdata.Sum(arr => (int)arr[1]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多