如何避免填充所有对象属性-而是只填充所需的一个属性,并保持其余属性不变-C#
我想对我的对象列表进行分组,并对它们的总数进行求和,因此最终结果可能如下所示:如何避免填充所有对象属性-而是只填充所需的一个属性,并保持其余属性不变-C#,c#,linq,group-by,sum,C#,Linq,Group By,Sum,我想对我的对象列表进行分组,并对它们的总数进行求和,因此最终结果可能如下所示: 1 Coca cola 3x 15.00$ 2 Pepsi 1x 5.00$ 与此相反: 1 Coca Cola 2x 10.00$ 2 Pepsi 1x 5.00$ 3 Coca Cola 1x 5.00$ 这是我的密码: List<Product> result = productsList .GroupBy(l => l.Article.
1 Coca cola 3x 15.00$
2 Pepsi 1x 5.00$
与此相反:
1 Coca Cola 2x 10.00$
2 Pepsi 1x 5.00$
3 Coca Cola 1x 5.00$
这是我的密码:
List<Product> result = productsList
.GroupBy(l => l.Article.Title)
.Select(cl => new Product
{
// Avoid assigning all the properties somehow?
TotalAmount = cl.Sum(c => c.TotalAmount),
}).ToList();
列表结果=产品列表
.GroupBy(l=>l.Article.Title)
.选择(cl=>新产品
{
//避免以某种方式分配所有属性?
TotalAmount=cl.Sum(c=>c.TotalAmount),
}).ToList();
我的Product
类有20个属性,我希望避免填充所有属性,但我希望保持它们的值不变(我不希望丢失其他属性的值)
所以,如果我想对产品进行分组,并将它们的TotalAmount
更改为我想对它们求和,那么这是可能实现的,仅此而已
这有可能吗?我认为只有通过使用reflaction映射属性才有可能。 然后,更改对象新距离的总量。。。诸如此类:
var result = productsList
.GroupBy(l => l.Article.Title)
.Select(cl =>
{
var product = new Product();
Reflection.CopyProperties(cl.First(), product);
product.TotalAmount = cl.Sum(c => c.TotalAmount);
return product;
}).ToList();
或者,您可以将结果映射到新的类类型:
var result = productsList
.GroupBy(l => l.Article.Title)
.Select(cl => new ProductItem
{
Product = cl.First(),
TotalAmount = cl.Sum(c => c.TotalAmount),
}).ToList();
您可能希望生成一些代码,这些代码将使用与
GroupBy
相同的属性集,并创建产品
对象。。。并在“产品”中添加适当的深度克隆。。。真的没有什么内在的it@AlexeiLevenkov请你举个例子,让我接受它作为答案,这可能对很多人都有用。感谢AlexeiGood对一般解决方案的阐述。请注意,要在一般情况下有合理的行为,GroupBy和“共享”属性需要匹配,否则您将覆盖一些其他属性,如{“cola”、$3、罐装}、{“cola”、$5、罐装}产生{“cola”、$8、罐装},这可能是意外的结果(可能{“cola”、$8、undefined}更好,这取决于具体情况)。编写这样的代码是读者的练习:)