2010-11-24 4 views
0
私はそうと List<MyType>を持っている場合は

、コレクション内の項目を表す各ラインで:Linqを使ってシーケンスのサブシーケンスにフィルタを適用する

{{ Id = 1, Year = 2010 }, 
{ Id = 1, Year = 2009 }, 
{ Id = 1, Year = 2008 }, 
{ Id = 2, Year = 2010 }, 
{ Id = 2, Year = 2009 }, 
{ Id = 2, Year = 2008 }} 

私はIDごとに最新の項目のこのコレクションからコレクションを取得したいです。この外観のLinqはどのようなものでしょうか?

所望の出力:

{{ Id = 1, Year = 2010 }, 
{ Id = 2, Year = 2010 }} 

私は2番目のリスト変数とforeachループを使用してnaiive実装を持っているが、それは非効率的です。

//naiive implementation "p-code" 
//... 
var mostRecentItems = new List<MyType>();  
var ids = collection.Select(i => i.Id).Distinct(); 
foreach(var id in ids) 
{ 
    mostRecentItems.Add(collection.Where(i => i.Id == id).OrderByDescending().First); 
} 

return mostRecentItems; 

答えて

4

最も単純:

+1

+1これが正しいものです。 –

+0

ありがとうございます。 TBH、私はGroupByの周りに頭を上げていません。誰かが簡単な説明をオンラインで知っていれば投稿してください。 – Ben

+0

ああ、まあ、もう一度打つ。 – tvanfosson

1
var mostRecentById = from item in list 
        group item by item.Id into g 
        select g.OrderByDescending(x => x.Year).First(); 

グループIDによって、その後下降様式で順序付けられ、各グループ内の最初の項目を選択します。

単にまだ
var mostRecentItems = collection.GroupBy(c => c.Id) 
           .Select(g => g.OrderByDescending(i => i.Year).First()); 
0

以上:

var result = list 
       .GroupBy(i => i.Id) 
       .Select(g => new {Id = g.Key, Year = g.Max(y => y.Year)}); 
関連する問題