繁体   English   中英

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

[英]C# LINQ Select objects with the same value of one property join values of other

我有一个像这样的产品清单:

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();

这不能给我添加第二种颜色的能力。 是否会给予任何帮助

尝试这个。

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

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

完整代码:

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

我并不是说这更好或更有效,但它是值得替代的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM