c# - 使用 LINQ 对项目进行分组和组合

标签 c# .net linq

public class Product
{
    public string Code { get; set; }
    public string Name { get; set; }
    public string Amount { get; set; }
}

public List<Product> Products = new List<Product>()
{
    new Product() { Code="A1", Name="Vacuum", Amount = "10" },
    new Product() { Code="A2", Name="Iron", Amount = "20" },
    new Product() { Code="A3", Name="Kettle", Amount = "13" },
    new Product() { Code="A2", Name="Microwave", Amount = "11" },
    new Product() { Code="A3", Name="Dryer", Amount = "3" }
};

我需要选择没有重复代码的所有产品。具有相同代码的产品应合并为一行,在这种情况下,名称和数量应以逗号分隔。如何修改下面的代码,让它更优雅

    var list1 = new List<Product>();
    var gl = Products.GroupBy(x => x.Code).Where(x => x.Count() > 1);
    gl.ToList().ForEach(x => list1.AddRange(x));

    var list2 = Products.Where(x => !list1.Contains(x)).ToList(); // uniq values

    var list3 = gl.Select(x =>
    {
        var p = new Product() { Code = x.Key };
        p.Name = string.Join(",", x.ToList().Select(r => r.Name).Distinct());
        p.Amount = string.Join(",", x.ToList().Select(r => r.Amount).Distinct());
        return p;
    }).ToList();

    list2.AddRange(list3);
    list2.ForEach(x =>
    {
        Console.WriteLine($"{x.Code.PadRight(20)},{x.Name.PadRight(20)},{x.Amount.PadRight(20)}");
    });

结果应该是:

Code  Name              Amount
A1    Vacuum            10
A2    Iron, Microwave   20, 11
A3    Kettle, Dryer     13, 3

最佳答案

Code 上使用 GroupBy,然后对其进行迭代以使用 string.Join() 组合各个元素。

var results = products
    .GroupBy
    ( 
        p => p.Code
    )
    .Select
    (
        g => new 
        {
            Code = g.Key, 
            Name = string.Join
            (
                ",",
                g.Select( p => p.Name )
            ), 
            Amount = string.Join
            (
                ",", 
                g.Select( p => p.Amount.ToString() )
            )
        }
    );

输出:

A1 Vacuum 10
A2 Iron,Microwave 20,11
A3 Kettle,Dryer 13,3

Link to working example on DotNetFiddle

关于c# - 使用 LINQ 对项目进行分组和组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56352189/

相关文章:

c# - ASP.NET Core,运行时如何推理启动类?

C# - 删除文本文件中的重复行

sql - 由于 Linq to Sql 更新中的 ChangeConflictException,如何更改 LinqToSQL 中的 NOCOUNT 设置

c# - 为指定用户打开 "Find shelvesets"页面

c# - OpenXML 如何添加指向另一个工作表的超链接

c# - 我可以通过不同的 "API"DLL 只公开一个 .NET DLL 的公共(public)类的一部分吗?

c# - 如何从列表中选择每第 6 个元素(使用 Linq)

c# - Linq 从数据库表中选择,其中匹配属性来自列表

c# - 如何在抽象基类中部分实现契约?

.net - 使用 .NET 的 Rabin 指纹