2016-04-25 6 views
4

私はレコードのリストを持っています、それぞれのレコードはです。名前ラウンドです。 ラウンドで区切って連結した数字である「 - 」Linq groupby帰ってきたグループ

enter image description here

どのように私は名前と表示のみ独特のラウンドでグループ、また、ラウンド数をカウントし、最初のラウンドと最終ラウンドを表示することができますここで

enter image description here

は、私が試したものです

data.GroupBy(d => d.Name) 
.Select(
    g => new 
    { 
     Name = g.Key, 
     Rounds = g.Concat(s => s.Rounds), 
     NumberOfRounds = g.Concat(s => s.Rounds).Split('-').Count, 
     FirstRound = //??, 
     LastRound = //??, 
    }); 
+0

使用 '.SelectMany()'私は私のコンピュータではないですか、私は答えを投稿します。 –

答えて

5

私は名とコレクション・オブ・ラウンドペアにあなたのエンティティを投影することによりを開始します。そうすれば、より簡単に作業できます。たとえば:あなただけRounds.CountRounds.First()Rounds.Last()を使用することができるようリストとして利用できるのラウンドで

var query = results 
    .Select(d => new { d.Name, Results = d.Rounds.Split('-').Select(int.Parse).ToList() }) 
    .GroupBy(
     d => d.Name, (key, values) => new { 
      Name = key, 
      Rounds = values.SelectMany(v => v.Rounds) 
          .Distinct() 
          .OrderBy(x => x) 
          .ToList() 
     }); 

、私は、NumberOfRoundsFirstRoundやプロパティなどLastRoundを持つことに多くのポイントがあることを表示されません。重要な部分は、できるだけ早くデータをより有用な形式に変換することです。

あなたが本当にプロパティで、それがプロジェクトに十分に簡単だということが必要な場合:

// query as before, but with 
.Select(x => new { 
    x.Name, 
    x.Rounds, 
    NumberOfRounds = x.Rounds.Count, 
    FirstRound = x.Rounds.First(), 
    LastRound = x.Rounds.Last() 
}); 
+0

私の質問に答えるためにthx! – Maro

1

まず、ラウンドを数値に抽出する必要があります。その後は簡単です。

var data = ...; 
var groupedData = data 
    .GroupBy(x => x.Name) 
    .Select(x => new { 
     Name = x.Key, 
     Rounds = string.Join("-", x.Select(z => z.Rounds)) 
      .Split('-') 
      .Distinct() 
      .Select(z => int.Parse(z)) 
      .OrderBy(z => z) 
      .ToArray() 
    }) 
    .Select(x => new { 
     x.Name, 
     Rounds = string.Join("-", x.Rounds), 
     NumberOfRounds = x.Length, 
     FirstRound = x.Min(), 
     LastRound = x.Max() 
    }) 
    .ToArray(); 
+0

@juharr括弧はどこにありますか? '.ToArray()'は 'string.Join(...)'呼び出しの一部ではありません。 – Maarten

+0

最初の 'Select'の' x'は 'IGrouping'なので' Rounds'プロパティはありません。 – juharr

+0

@juharrありがとう、ありがとう。 – Maarten