首页 > 解决方案 > 如何避免填充所有对象属性 - 而是只填充需要的一个并保持原样 - C#

问题描述

我想对我的对象列表进行分组并将它们的总数相加,所以基本上最终结果可能如下所示:

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

我的Product班级有 20 个属性,我想避免填充所有属性,但我想保持它们的值不变(我不想丢失其他属性的值)。

TotalAmount如果我想对产品进行分组并根据我想对它们求和而改变它们,那么这是否可能实现,就是这样。

这有可能吗?

标签: c#linqgroup-bysum

解决方案


我认为只有使用反射映射属性才有可能。 https://stackoverflow.com/a/8724150

然后,更改对象的新实例的 TotalAmount ......类似这样的东西:

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

推荐阅读