使用C# LINQ选择具有一个属性相同值的对象并联接其他值

6

我有一个像这样的产品列表:

Prod1: Id=1, Name="name1", Color="Blue"
Prod2: Id=1, Name="name1", Color="Green"
Prod3: Id=2, Name="Test2, Color="Red"

我想要实现的是获取类似于以下这样的缩小列表:
Prod1: Id=1, Name="name1", Color="Blue, Green"
Prod3: Id=2, Name="Test2, Color="Red"

我想将具有相同id的产品颜色加起来。我感觉有一行巧妙的代码可以实现这个功能,但我卡在了这里:

productList.GroupBy(p => new { p.Id }).Select(x => x.First()).ToList();

这个程序没有让我能够添加第二种颜色。非常感谢您的帮助。

2个回答

16

试一下。

productList.GroupBy(p => new { p.Id, p.Name })
           .Select(x =>new {
                      Id =x.Key.Id, 
                      Name = x.Key.Name,
                      Color = String.Join(",", x.Select(c=> c.Color)) 
               }); 

工作中的Demo


0

另一种方法是尝试编辑产品列表中的每个产品的第一个实例,将所有实例的颜色都添加进去,而不需要创建一个新的匿名类型来保存数据(根据被接受的答案)。

完整代码:

public class Program
{
    public static void Main()
    {
        List<Product> products = new List<Product>
        {
            new Product() {Id = 1, Name="name1", Color="Blue"},
            new Product() {Id = 1, Name="name1", Color="Green"},
            new Product() {Id = 1, Name="name1", Color="Green"},
            new Product() {Id = 2, Name="name2", Color="Red"}
        };
                                 
        var results = from product in products
            group product by product.Id into g // there is no need to group by a complex key if product.Id is unique per product
            let colors = string.Join(",", g.Select(c=> c.Color).Distinct()) 
            let p = g.First().Color = colors
            select g.First();
                        
        foreach(var result in results)
            Console.WriteLine(result);          
    }
}

public class Product
{
    public int Id;
    public string Name;
    public string Color;
    
    public override string ToString()
    {
        return string.Format("Id:\"{0}\", Name:\"{1}\", Color:\"{2}\"", Id, Name, Color);
    }
}

这将直接更改id=1的第一个产品实例的“Color”属性值,丢弃列表中的任何其他实例。

它将打印:

Id:"1", Name:"name1", Color:"blue,Green"
Id:"2", Name:"name2", Color:"Red"

可运行的代码:https://dotnetfiddle.net/HLtHIE

我并不声称这是更好或更高效的,但它是一个值得考虑的替代方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接