【问题标题】:Linq (GroupBy and Sum) over List<List<string>>List<List<string>> 上的 Linq(GroupBy 和 Sum)
【发布时间】:2014-02-14 21:12:42
【问题描述】:

我有一个结构:

List<List<string>> content

这基本上是逗号分隔文件的内容。列表中的第一个元素将是表示标题的字符串列表。列表中的所有其他元素将是表示值的字符串列表。

我正在尝试运行如下查询。其中“代码”和“书”是两个标题,我需要按它们 2 分组并按另一个标题求和。这是我的尝试,但我当然不能直接在内容上使用 Groupby,因为它是一个列表列表。

List<List<string>> content = MyContent();

var linqResults = content
                  .GroupBy(x => new { Code = x["code"], Book = x["book"] })
                  .Select(g =>
                   {
                       return new
                       {
                           Book = g.Key.Book,
                           Code = g.Key.Code,
                           Total = g.SelectMany(x => x["columnToSum"].Sum())
                       };
                   });

【问题讨论】:

  • 我建议您将 csv 文件解析为强类型实体列表(例如订单),而不是字符串列表。然后计算总数看起来像orders.GroupBy(o =&gt; new { o.Book, o.Code }).Select(g =&gt; new { g.Key.Book, g.Key.Code, Total = g.Sum(o =&gt; o.ColumnToSum) })

标签: c# .net linq


【解决方案1】:

我同意 Sergey 的评论,但你可以这样做:

var content = new List<List<string>>
        {
            new List<string>{ "book", "code", "columnToSum" },
            new List<string>{ "abc", "1", "10" },
            new List<string>{ "abc", "1", "5" },
            new List<string>{ "cde", "1", "6" },
        };

var headers = content.First();
var result = content.Skip(1)
    .GroupBy(s => new { Code = s[headers.IndexOf("code")], Book = s[headers.IndexOf("book")]})
    .Select(g => new
             {
                 Book = g.Key.Book,
                 Code = g.Key.Code,
                 Total = g.Select(s => int.Parse(s[headers.IndexOf("columnToSum")])).Sum()
             });

返回:

{ Book = abc, Code = 1, Total = 15 }
{ Book = cde, Code = 1, Total = 6 }

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多