按对象的字段组合列表中的对象

时间:2013-05-22 13:03:50

标签: c#

我有一个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)。我一直在冲我的头一段时间,如果有人能帮我一把,那将是非常棒的。感谢你提前的帮助,抱歉我的英语不好。

2 个答案:

答案 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()

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

答案 1 :(得分:2)

JonSkeet已经完美地回答了这个问题,因为它只能通过一个属性进行分组。我尝试在评论中解释两个或多个属性的分组,但它不合适,所以我将把它作为一个单独的答案。

ArticlePrice是你可以期待随着时间的推移而变化的东西 - 资本主义的事实往往使我们完美的代码不那么完美。你提到过:

  

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

这是一个稍微不同的要求,因此根据您要回答的问题:

  • 如果您GroupBy(x => x.ArticleID)您正在回答“我出售了ArticleID 12345的项目数”;
  • 如果你按ID和价格进行分组,你会回答“当我们以10美元的价格卖出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
                 });