我有一个像这样的产品清单:
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();
这不能给我添加第二种颜色的能力。是否会提供任何帮助
答案 0 :(得分:13)
试试这个。
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
答案 1 :(得分: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);
}
}
这将改变&#34;颜色&#34;的价值。 id = 1的第一个产品实例的属性,丢弃列表中的任何其他实例。
它将打印:
Id:"1", Name:"name1", Color:"blue,Green"
Id:"2", Name:"name2", Color:"Red"
工作代码:https://dotnetfiddle.net/HLtHIE
我并不是说这更好或更有效,但它是值得替代的。