我有一个BillArticle对象列表,这个类看起来像这样:
public class BillArticle
{
public int ArticleID { get; set; }
public string ArticleName { get; set; }
public double ArticleQuantity { get; set; }
public double ArticlePrice { get; set; }
}
所以我有List contaning让我说10个对象,我想通过重复ArticleID和ArticlePrice来合并这些对象。
所以我的问题是这样的:我想要查看列表,如果有2个或更多具有相同ArticleID和相同价格的对象将它们合并(以汇总ArticleQuantity)。我一直在冲我的头一段时间,如果有人能帮我一把,那将是非常棒的。感谢你提前的帮助,抱歉我的英语不好。
答案 0 :(得分: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
成为List<BillArticle>
,请在最后添加.ToList()
。
答案 1 :(得分:2)
JonSkeet已经完美地回答了这个问题,因为它只能通过一个属性进行分组。我尝试在评论中解释两个或多个属性的分组,但它不合适,所以我将把它作为一个单独的答案。
ArticlePrice
是你可以期待随着时间的推移而变化的东西 - 资本主义的事实往往使我们完美的代码不那么完美。你提到过:
具有相同ArticleID和相同价格的2个或更多对象
这是一个稍微不同的要求,因此根据您要回答的问题:
GroupBy(x => x.ArticleID)
您正在回答“我出售了ArticleID
12345的项目数”; ArticleID
12345时有多少件商品,当他们的价格是20美元......”。 第二种情况对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
});