c# - 用 Linq 合并 List<T>?

标签 c# linq lambda

我只是想知道是否有办法用 linq 合并订单对象列表?我的场景如下,我为了这个问题的目的而浓缩了。

public class Order
{
    public string Guid { get; set; }
    public string Parent { get; set; }
    public string ProductID { get; set; }
    public string Description { get; set; }
    public double Quantity { get; set; }
    public double Total { get; set; }
}

这将成为基于上述内容的列表,如下所示:

GUID       PARENT       ID         Desc          Qty           Total
====================================================================
aaa                     120        Burger         1            2.50
bbb        aaa          121        + Bacon        1            0.50
ccc                     123        Fries          1            1.50
ddd                     120        Burger         1            2.50
eee        ddd          124        + Cheese       1            0.30
fff                     123        Fries          1            1.50

在这个例子中我想做的是以下面的结尾

GUID       PARENT       ID         Desc          Qty           Total
====================================================================
aaa                     120        Burger         1            2.50
bbb        aaa          121        + Bacon        1            0.50
ccc                     123        Fries          2            3.00
ddd                     120        Burger         1            2.50
eee        ddd          124        + Cheese       1            0.30

如果该项目有子产品,我不会尝试合并,并且基本上总计为其他所有项目的总数和数量。

我现在的想法是创建一个单独的列表,仅包含没有子项的产品,然后与有子项的产品进行精心合并。

我可以这样做,但我想知道是否有更简洁的方法,任何输入都将不胜感激

最佳答案

这应该使子订单分开,并仅合并独立订单:

var orders = originalOrders.GroupBy(_ => _.parent ? _.parent : _.guid);
var consolidated = orders
    .Where(grp => grp.Count() == 1) // only orders with no children
    .SelectMany(grp => grp)
    .GroupBy(_ => _.ID)
    .Select(grp => grp.Aggregate((a,b) => new order
        {
            guid = a.guid,
            parent = a.parent,
            ProductID = a.ProductID,
            Description = a.Description,
            Quantity = a.Quantity + b.Quantity,
            Total = a.Total + b.Total
        }
));

var allOrders = orders
    .Where(grp => grp.Count() > 1)
    .SelectMany(grp => grp)
    .Concat(consolidated);

关于c# - 用 Linq 合并 List<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36893945/

相关文章:

c# - 我需要注册 C# 表单方面的帮助

c# - 将文件上传控件作为参数传递给方法

asp.net-mvc-3 - 在 linq toEntity 中选择最大值

c# - LINQ 到 XML : Collapse mutliple levels to single list

c# - C# 中的 Java 方法 'MessageDigest.getInstance()' 相当于什么?

c# - 如何处理 MSTest 中的 IDisposable fixture 成员?

c# - 如何使用 linq 在列表的所有成员上运行一个函数?

c++ - 是否可以确定 lambda 的参数类型和返回类型?

haskell - 在 Haskell 中选择配对函数

java - 使用泛型和 lambda 重载方法时调用方法不明确