2017-05-06 6 views
0

たとえば、string[] Genresプロパティを持つTrackクラスがあります。要素を配列でグループ化する/コレクション<T>

Trackを効率的にグループ化し、必要に応じて1つのエントリを複数のグループの一部にすることはできますか?たとえば、次の収集のために:

A - Rock 
B - Pop, Rock 
C - Rock, Soundtrack 
D - Pop, Soundtrack 

これがあるべきに対する結果:

Rock - A, B, C 
Pop - B, D 
Soundtrack - C, D 

は、LINQを使用していることを行うための簡単な方法はありますか?または、LINQ alltogetherを使用するより効率的な方法がありますか?

ありがとうございます!トラックの名前やジャンル - - ジャンルの一つ当初、我々は2つのプロパティトラックと匿名オブジェクトの配列を、SelectMany方法を使用して私たちのコレクションを平ら

var genresTracks = tracks.SelectMany(track => track.Genres, (track, genre) => new 
         { 
          // you might want to correct the Name property 
          // with the correct one. 
          Track = track.Name, 
          Genre = genre 
         }) 
         .GroupBy(tg => tg.Genre) 
         .Select(gr => new 
         { 
          Genre = gr.Key, 
          Tracks = gr.Select(x=>x.Track) 
         }); 

foreach(var genreTracks in genresTracks) 
{ 
    var tracksCsv = string.Join(",", genreTracks.Tracks); 
    Console.WriteLine($"{genreTracks.Genre} - {tracksCsv}"); 
} 

答えて

3

あなたはこのような何かを試みることができますこのトラックはカテゴリに分類することができます。したがって、新しいシーケンスは、 "A"、 "Rock"、 "B"、 "Rock"、 "B"、 "Pop"などのようなペアで構成されます。GroupBy Genreプロパティを使用すると、トラック名のGenreとMembersというキーでグループが作成されます。最後に、各グループをGenreTracksの2つのプロパティを持つオブジェクトに投影します。

+0

興味深いアプローチです。ありがとう! – Reynevan

+0

XAMLバインディングに合わせるためにコードにいくつかの変更を加えました。まず、最後の '.Select()'クエリを削除しました。 '.GroupBy()'クエリを '.GroupBy(tg => tg.Genre、tg => tg.Track);に変更しました。このようにして、LINQクエリ全体の結果として、IEnumerable >を取得します。 – Reynevan

+0

@Reynevanいいね!どういたしまして ! – Christos

関連する問題