2016-04-06 26 views
3

と仮定、例えば、私のC#コードで、私は以下のように定義MyClass、持っている:複数のネストされたグループのLINQで

public class MyClass 
{ 
    public string GroupName; 
    public DateTime Dt; 
    .... other properties .... 
} 

をそして、私はそれが最も簡単なようですので、List<MyClass>が(それを表として示す以下の持っていたと仮定内容を記述するための方法):

GroupName:  Dt:    Val: 
Group1   2016/01/01  a 
Group1   2016/01/02  b 
Group1   2016/01/03  c 
Group2   2016/01/01  d 
Group2   2016/01/02  e 
Group3   2016/01/01  f 
Group3   2016/01/02  g 
Group3   2016/01/03  h 

そして、私はこのリストからすべてのデータを取得するために探しています:

  1. は、まず、第二にそうGroupName

でグループ化されたDt

  • によってグループ化された(と私は、これは間違っていると確信しているが、私はそれが私が探しているものを説明します願っています)、私は思いますこれは以下の通りであった得るために管理するにIEnumerable<IGrouping<DateTime, IEnumerable<IGrouping<string, IEnumerable<MyClass>>>>

    私の最高の試み取得したい:

    return MyList 
        .GroupBy(d => d.Dt) 
        .GroupBy(grp => grp.ToList().GroupBy(d => d.GroupName)); 
    

    を私は、これは間違っている知っているが、これは私が把握できた唯一のものです。 私は何をお探しですか?

  • 答えて

    5

    使用Select

    return MyList 
        .GroupBy(d => d.Dt) 
        .Select(grp => grp.GroupBy(d => d.GroupName)); 
    

    あなたがSelect後、余分なGroupByを必要とするだろう欲しいものを正確に取得するには、@Marcinを

    var groups = MyList 
        .GroupBy(d => d.Dt) 
        .Select(grp => new { key = grp.Key, items = grp.GroupBy(d => d.GroupName) }) 
        .GroupBy(grp => grp.key, grp => grp.items); 
    

    enter image description here

    +0

    おかげで、私は」私はまだこれをグループ>として返すことに固執しています。ここで 'Dts'を最初に反復し、次に' Groupnames'を2番目に反復することができます。あなたの解決策はこれを達成するはずですか? 戻りMYLIST .GroupBy(D => d.Dt) .Select(G1 =: –

    +1

    それはネストされたグループであるが、ここで明確にするためには、あなたが 'すべてに.'とは何が起こっているか見ることができ、より明示的なバージョンです>新しい {Dtを= g1.Key、 DTS = g1.GroupBy(D => d.GroupName) .Select(G2 =>新しい {GroupNameの= g2.Key、 GroupNames = G2 }) }); – gzak

    +0

    @MarcinJuraszek、あなたの答えに編集されたバージョンを貼り付けてください。 – gzak

    関連する問題