[英]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.