2013-05-22 42 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 
       });