【问题标题】:Simplest way to perform grouping/projection using Linq To Objects使用 Linq To Objects 执行分组/投影的最简单方法
【发布时间】:2010-09-13 18:55:53
【问题描述】:

我正在从需要使用 Linq To Objects 在中间层转换的数据层获取数据(我不控制应用程序的该层)。我必须使用多个键执行分组操作,然后在非键字段上进行字符串连接。鉴于下面的数据,我想按 CustomerID 和 Date 分组,并创建一个新结构,其中仅基于键生成单行,并且非键字段(在本例中为 Item)组合成一个字符串:

    CustomerID  Date         Item
    A          11/1/2001    Bread
    A          11/1/2001        Orange Juice
    A          11/1/2001        Salad Dressing
    B          11/1/2001    Bananas
    C          5/6/2001     Candy
    C          12/8/2005    Candy               


    CustomerID  Date         Item
    A          11/1/2001    Bread
                             Orange Juice
                             Salad Dressing
    B          11/1/2001    Bananas
    C          5/6/2001     Candy
    C          12/8/2005    Candy

这是否可以使用函数式 linq 语法,还是我必须求助于老式的命令式 foreach 语法?

【问题讨论】:

    标签: c# linq .net-3.5 projection linq-group


    【解决方案1】:

    或者:

    var results = items
      .GroupBy(i => new { i.Date, i.CustomerID })
      .Select(g => new {
        CustomerID = g.Key.CustomerID,
        Date = g.Key.Date,
        Item = string.Join(", ", g.Select(i => i.Item).ToArray())
      });
    

    【讨论】:

    • 我在 VS 中写了同样的东西,但是编译器抱怨包含一个 IEnumerable 作为 string.Join() 的参数。这将起作用:“g.Select(i => i.Item).ToArray()”。
    • @Jimmy W: String.Join 有一个重载,从 .NET 4.0 开始可以接受任何 IEnumerable。
    • 啊,我使用的是 .NET 3.5。有道理。
    • 我正在使用 .NET 3.5;抱歉应该在问题中提到这一点。
    • @Dirk:然后按照 @Jimmy W 的指示添加.ToArray,应该没问题。
    【解决方案2】:

    这样的?

    var result = from item in items
                 group item by new { item.Date, item.CustomerID } into g
                 select new
                 {
                     g.Key.CustomerID,
                     g.Key.Date,
                     Item = string.Join(", ", from i in g select i.Item)
                 };
    

    【讨论】:

    • 只有 .Min 日期?不需要分组两次吗?
    • 你在我发表评论之前更改了它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多