【问题标题】:How to avoid populating all object properties - instead populate only needed one and keep rest as it is - C# [closed]如何避免填充所有对象属性 - 而是只填充需要的一个并保持原样 - C# [关闭]
【发布时间】:2020-03-21 05:57:24
【问题描述】:

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

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,因为我想对它们求和,那么这是否可能实现,仅此而已。

这有可能吗?

【问题讨论】:

  • 您可能希望生成一些代码,这些代码将使用GroupBy 的相同属性集并创建您的Product 对象...并添加适当的 deep clone 到`产品...确实没有内置任何东西
  • @AlexeiLevenkov 请您发布一个示例,以便我接受它作为答案,这可能对许多人有用。谢谢阿列克谢

标签: c# linq group-by sum


【解决方案1】:

我认为只有使用反射映射属性才有可能。 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();

【讨论】:

  • 一般解决方案的良好说明点。请注意,在一般情况下要具有合理的行为 GroupBy 和“共享”属性需要匹配,否则您会覆盖一些其他属性,例如 {"cola", $3, in cans}, {"cola", $5, in bottle} 会产生 { "cola", $8, in cans} 这可能是意想不到的结果(也许 {"cola", $8, undefined} 更好 - 取决于)。编写这样的代码是读者的练习:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多