2011-07-12 65 views
2

我有一個對象的集合,每個對象由特定的「組」定義。我如何編寫一個LINQ查詢來產生按「組」分組的每個對象的計數。LINQ - 分組對象的計數類型

作爲一個例子,可以說我有以下類;

public class Release 
{ 
    int ReleaseNumber; 

    public ReleaseDetails[] details; 

} 

public class ReleaseDetails 
{ 
    string Group; 

    // other details omitted 
} 

對於給定的版本,我希望能夠產生像這樣的輸出;

Release number 1 contains the following details; 
- 17 records in Group A 
- 12 records in Group B 
- 6 records in Group C 

任何幫助,非常感謝。

回答

2

你可以做這樣的事情

var q = from d in r.Details 
      group d by d.Group into counts 
      select new { Count = counts.Count(), Group = counts.Key }; 

完整的示例:

 Release r = new Release 
     { 
      ReleaseNumber = 1 
      , 
      Details = new ReleaseDetails[] 
      { 
       new ReleaseDetails { Group = "a"}, 
       new ReleaseDetails { Group = "a"}, 
       new ReleaseDetails { Group = "b"}, 
       new ReleaseDetails { Group = "c"}, 
       new ReleaseDetails { Group = "d"}, 
       new ReleaseDetails { Group = "d"}, 
       new ReleaseDetails { Group = "e"}, 

      } 
     }; 

     var q = from d in r.Details 
       group d by d.Group into counts 
       select new { Count = counts.Count(), Group = counts.Key }; 

     foreach (var count in q) 
     { 
      Console.WriteLine("Group {0}: {1}", count.Group, count.Count); 
     } 
+0

太棒了。就是我以後的樣子。謝了哥們。 –

1

在這裏你去。

public class ReleaseDetails 
    { 
     public string Group { get; set; } 
     public ReleaseDetails() {} 
     public ReleaseDetails(string grp){Group = grp;} 
    } 

      var qry = new Release(); 
      qry.details = new List<ReleaseDetails>(); 
      qry.details.Add(new ReleaseDetails("A")); 
      qry.details.Add(new ReleaseDetails("A")); 
      qry.details.Add(new ReleaseDetails("B")); 
      qry.details.Add(new ReleaseDetails("C")); 
      qry.details.Add(new ReleaseDetails("C")); 
      qry.details.Add(new ReleaseDetails("B")); 


var result = from x in qry.details 
       group x by x.Group into g 
       select new 
       { 
        Count = g.Count(), 
        Group = g.Key 
       }; 

//Or using Labmda 
var result1 = qry.details.GroupBy(x => x.Group).Select(g => new { Count = g.Count(), Group = g.Key }); 
+0

嗯,像faesters的例子,你實際上需要在ReleaseDetails中提供Group屬性,然後再嘗試在linq查詢中對它進行分組。除此之外,它看起來像你提出了幾乎完全相同的faester。 –

+0

對不起,我沒有複製ReleaseDetails ctor我分配Group.The代碼假定它包含在「其他細節省略」。 –

+0

我編輯答案,包括ctor和lambda做分組的方式。 –