2015-12-07 41 views
0

我能想出一個魯貝戈德堡式的方式來做到這一點,但我認爲大概可以使用LINQ更加優雅和簡潔地完成:如何使用LINQ按一個字段進行分組,在該分組內進行排序並對該組合進行求和?

有了這個類的實例的泛型列表:

public class PlatypusData 
{ 
    public String MemberName { get; set; } 
    public String CompanyName { get; set; } 
    public String ReasonDescription { get; set; } 
    public String TransactionType { get; set; } 
    public int QtyOrdered { get; set; } 
    public int QtyShipped { get; set; } 
} 

我想濃縮到前四個類成員(MemberName,CompanyName,ReasonDescription,TransactionType)的唯一值的行或記錄。

例如,像這樣定義一個通用的清單:

List<PlatypusData> _platypusDataList = new List<PlatypusData>(); 

...這個泛型列表的內容可能是諸如數據:

MemberName = "Ollie of Burkina Faso" 
CompanyName = "Riley's Rugbeaters" 
ReasonDescription = "Credit - Failed to deliver item (for credit adjustments only)" 
TransactionType = "CREDIT ITEM" 
QtyOrdered = 1 
QtyShipped = 1 

MemberName = "Oscar of Redlands" 
CompanyName = "Herrera's Empty Frames" 
ReasonDescription = [blank] 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 7 
QtyShipped = 6 

MemberName = "Ollie of Burkina Faso" 
CompanyName = "Gatherer Mechanics" 
ReasonDescription = "Credit - Product Quality (for credit adjutments only)" 
TransactionType = "CREDIT ITEM" 
QtyOrdered = 3 
QtyShipped = 3 

MemberName = "Ollie of Burkina Faso" 
CompanyName = "Riley's Rugbeaters" 
ReasonDescription = [blank] 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 42 
QtyShipped = 42 

MemberName = "Oscar of Redlands" 
CompanyName = "Fidelity Fire" 
ReasonDescription = "Credit - Failed to deliver item (for credit adjustments only)" 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 5 
QtyShipped = 4 

MemberName = "Oscar of Redlands" 
CompanyName = "Herrera's Empty Frames" 
ReasonDescription = [blank] 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 7 
QtyShipped = 7 

MemberName = "Ollie of Burkina Faso" 
CompanyName = "Gatherer Mechanics" 
ReasonDescription = [blank] 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 11 
QtyShipped = 10 

MemberName = "Oscar of Redlands" 
CompanyName = "Fidelity Fire" 
ReasonDescription = [blank] 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 6 
QtyShipped = 7 

MemberName = "Oscar of Redlands" 
CompanyName = "Fidelity Fire" 
ReasonDescription = [blank] 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 8 
QtyShipped = 8 

MemberName = "Ollie of Burkina Faso" 
CompanyName = "Gatherer Mechanics" 
ReasonDescription = [blank] 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 12 
QtyShipped = 12 

...從中我想將每個唯一組合的MemberName + CompanyName + ReasonDescription + TransactionType壓縮爲一行,對於組合的行,QtyOrdered和QtyShipped是這些值的總和,並且從LINQ操作返回的數據由MemberName,然後CompanyName,那麼ReasonDescription就是這樣如:

MemberName = "Ollie of Burkina Faso" 
CompanyName = "Gatherer Mechanics" 
ReasonDescription = [blank] 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 23 
QtyShipped = 22 

MemberName = "Ollie of Burkina Faso" 
CompanyName = "Gatherer Mechanics" 
ReasonDescription = "Credit - Product Quality (for credit adjutments only)" 
TransactionType = "CREDIT ITEM" 
QtyOrdered = 3 
QtyShipped = 3 

MemberName = "Ollie of Burkina Faso" 
CompanyName = "Riley's Rugbeaters" 
ReasonDescription = [blank] 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 42 
QtyShipped = 42 

MemberName = "Ollie of Burkina Faso" 
CompanyName = "Riley's Rugbeaters" 
ReasonDescription = "Credit - Failed to deliver item (for credit adjustments only)" 
TransactionType = "CREDIT ITEM" 
QtyOrdered = 1 
QtyShipped = 1 


MemberName = "Oscar of Redlands" 
CompanyName = "Fidelity Fire" 
ReasonDescription = [blank] 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 14 
QtyShipped = 15 

MemberName = "Oscar of Redlands" 
CompanyName = "Fidelity Fire" 
ReasonDescription = "Credit - Failed to deliver item (for credit adjustments only)" 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 5 
QtyShipped = 4 

MemberName = "Oscar of Redlands" 
CompanyName = "Herrera's Empty Frames" 
ReasonDescription = [blank] 
TransactionType = "REGULAR ITEM - ON SPEC" 
QtyOrdered = 14 
QtyShipped = 13 

我想的GroupBy,排序依據的某種組合,並且需要求和,但不知道如何做到這一點(在LINQ /非Goldbergesque方式)。

回答

4

我想的GroupBy,排序依據的某種組合,總結需要

你說得對。這應該是你需要的:

var result = _platypusDataList 
    .GroupBy(i => new { i.MemberName, i.CompanyName, i.ReasonDescription, i.TransactionType }) 
    .Select(g => new 
     { 
      g.Key.MemberName, 
      g.Key.CompanyName, 
      g.Key.ReasonDescription, 
      g.Key.TransactionType, 
      QtyOrdered = g.Sum(i => i.QtyOrdered), 
      QtyShipped = g.Sum(i => i.QtyShipped) 
     }) 
    .OrderBy(i => i.MemberName) 
    .ThenBy(i => i.CompanyName) 
    .ThenBy(i => i.ReasonDescription) 
    .ToList(); 

上面的代碼返回一個匿名類型的列表。如果你想要一個List<PlatypusData>,你需要修改Select

.Select(g => new PlatypusData 
    { 
     MemberName = g.Key.MemberName, 
     CompanyName = g.Key.CompanyName, 
     ReasonDescription = g.Key.ReasonDescription, 
     TransactionType = g.Key.TransactionType, 
     QtyOrdered = g.Sum(i => i.QtyOrdered), 
     QtyShipped = g.Sum(i => i.QtyShipped) 
    }) 
+0

在最後一行(「ToList()」),我得到「無法隱式轉換類型「System.Collections.Generic.List < AnonymousType#1>'到'System.Collections.Generic.List ' –

+1

@ B.ClayShannon'.Select(g => new {...})'創建一個新的匿名類型,如果你想讓它返回'PlatypusData',它應該是'.Select(g => new PlatypusData {...})',我將它添加到我的答案中。 –

相關問題