1

我有一个 BillArticle 对象的列表,这个类看起来像这样:

public class BillArticle
{
    public int ArticleID { get; set; }

    public string ArticleName { get; set; }

    public double ArticleQuantity { get; set; }

    public double ArticlePrice { get; set; }
}

所以我有包含 10 个对象的列表,我想通过重复 ArticleID 和 ArticlePrice 来合并这些对象。

所以我的问题是:我想遍历列表,如果有 2 个或多个具有相同 ArticleID 和相同价格的对象来合并它们(总结 ArticleQuantity)。我现在一直在敲我的头,如果有人能帮我一把,我会很高兴的。提前感谢您的帮助,并为我的英语不好感到抱歉。

4

2 回答 2

6

LINQ 非常适合这种工作 :) 听起来你可能想要类似的东西:

var merged = list.GroupBy(x => x.ArticleID)
                 .Select(g => new BillArticle { 
                             ArticleID = g.Key,
                             ArticleName = g.First().ArticleName,
                             ArticleQuantity = g.Sum(x => x.ArticleQuantity),
                             ArticlePrice = g.First().ArticlePrice
                         });

这是假设您确信所有文章的价格和名称都相同。如果没有,您应该考虑如何处理这种情况。

如果您需要merged成为 a List<BillArticle>,只需.ToList()在末尾添加即可。

编辑:如安迪的回答中所述,您可以使用匿名类型按文章 ID 和文章价格进行分组。您仍然需要考虑文章名称。如果文章 ID 确实标识符,我希望名称和价格无论如何都相同,但这取决于您的业务规则。

于 2013-05-22T13:05:29.447 回答
2

JonSkeet已经完美地回答了这个问题,可以按单个属性进行分组。我试图在评论中解释按两个或多个属性进行分组,但它不适合,所以我将作为单独的答案来做。

ArticlePrice是你可以期望随着时间的推移而改变的东西——资本主义的一个事实,经常使我们完美的代码变得不那么完美。你提到:

2 个或更多具有相同 ArticleID 和相同价格的对象

这是一个略有不同的要求,因此取决于您要回答的问题:

  • 如果您要回答“我卖GroupBy(x => x.ArticleID)了多少带有 12345 的商品”;ArticleID
  • ArticleID如果您同时按 id 和 price 分组,则您将回答“当它们以 10 美元时,当它们以 20 美元时,我卖出了多少带有 12345 的物品……”。

对于第二种情况, JonSkeet代码的更改很简单(我已经用// changed here 注释记录了更改):

var merged = list.GroupBy(x => new {x.ArticleID, x.ArticlePrice }) // changed here
                 .Select(g => new BillArticle { 
                     ArticleID = g.Key.ArticleID, // changed here
                     ArticleName = (string)g.First().ArticleName,
                     ArticleQuantity = g.Sum(x => x.ArticleQuantity),
                     ArticlePrice = g.Key.ArticlePrice // changed here
                 });
于 2013-05-22T13:39:21.343 回答