2013-05-22 43 views
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; } 
} 

所以我必须列出contaning让说,10个对象,我想合并这重复ArticleID和ArticlePrice。

所以我的问题是这样的:我想通过列表,如果有2个或多个对象具有相同的ArticleID和相同的价格合并它们(总和ArticleQuantity)。我一直在p my我的头,现在如果有人能帮我一把,那将会很棒。感谢您提前给予的帮助,并为我的英语不好而感到遗憾。

回答

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

这是假设你有信心,所有物品的价格和名称将是相同的。如果不是,你应该考虑你想如何处理这种情况。

如果您需要mergedList<BillArticle>,只需在最后加上.ToList()即可。

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

+1

+1,哇,那是快。我还没有完成Select子句中的投影。 –

+0

+1非常感谢您的帮助! – Jordan

+0

@Jordan。我试图根据变化来展示如何在评论中通过ArticleId和ArticlePrice进行分组,但它不合适,我添加了第二个答案。 JonSkeet的第一个答案仅限于由“ArticleId”进行分组。@JonSkeet,我希望你能和你在一起。 –

2

JonSkeet已经完美地回答了这个完美的分组由一个属性。我尝试在注释中解释两个或更多属性的分组,并且它不适合,所以我会将其作为单独的答案来做。

ArticlePrice是你可能期望随着时间改变的东西 - 资本主义的事实往往使我们完美的代码不完美。你提到:用同样的条款ArticleID和相同的价格

这是一个稍微不同的要求

2个或多个对象,所以这取决于你所回答的问题:

  • 如果你GroupBy(x => x.ArticleID)你正在回答“我卖了多少件ArticleID12345”;
  • 如果您通过身份证和价格进行分组,您将回答“ArticleID 12345我有多少项目是在他们10美元的时候出售的,当时他们的价格是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 
       });