2011-07-12 8 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

Hmmm、faestersの例のように、実際には、linqクエリでグループ化しようとする前に、ReleaseDetails内のGroupプロパティを提供する必要があります。それ以外は、あなたがfaesterとほぼ同じように思いついたように見えます。 –

+0

申し訳ありませんが、私はGroupDを割り当てたReleaseDetails ctorをコピーしませんでした。コードは、 "他の詳細が省略されています"に含まれていると仮定しています。 –

+0

グループ化のctorとlambdaの方法を含めるように答えを編集しました。 –

関連する問題