2011-04-24 27 views
3

我有一個對象列表。例如。 List<coin>它們包含一個字符串(denom)和int(年)。 如果列表中包含:Linq通過比較選擇不同的值

"Quarter", 1954 
"Quarter", 1990 
"Penny", 1925 
"Nickel", 1900 
"Nickel", 2000 

我怎樣才能得到它包含只是最近一年的唯一值的結果的列表?例如:

"Quarter", 1990 
"Penny", 1925 
"Nickel", 2000 

回答

7

您可以通過名字,那麼無論排序分組和採取的第一個結果,或通過使用來自MoreLINQMaxBy做到這一點:

var query = coins.GroupBy(x => x.Name) 
       .Select(g => g.MaxBy(x => x.Year)); 

var query = coins.GroupBy(x => x.Name) 
       .Select(g => g.OrderByDescending(x => x.Year).First()); 
+1

我認爲該鏈接是http://code.google.com/p/morelinq/ – Stuart 2011-04-24 13:12:10

+0

謝謝喬恩。我用你的第二個答案。雖然我理解基本的SQL概念,但我可以在哪裏找到關於它如何工作的信息?例如。 .Select語句以及它如何在.OrderBy中引用x.Year? – tim 2011-04-24 13:20:05

+0

@tim:「GroupBy」結果中的每個元素都是一組具有相同名稱的硬幣。如果按照年份(降序)對每個組進行排序,那麼排序序列中的第一個條目就是該名稱的最新幣。 – 2011-04-24 13:39:31

1
var coins = new Coin[] { ... }; 

var recentCoins = 
    from coin in coins 
    group coin by coin.Denom into g 
    select new 
    { 
     Denom = g.Key, 
     MostRecentYear = g.Max(c => c.Year) 
    }; 
3

你可以使用group by這樣做:

var query = from coin in myList 
     group coin by coin.Name into grouped 
     select new 
     { 
      Name = grouped.Key 
      Year = grouped.Max(x => x.Year) 
     }; 

對於這樣的另一個樣品,檢查了 「最大 - 分組」,在101 LINQ的例子:http://msdn.microsoft.com/en-us/vcsharp/aa336747#maxGrouped

+0

+1有我的答案几乎重複;-) – Steven 2011-04-24 13:08:09

+0

我沒有輸入像JonSkeet一樣快:) – Stuart 2011-04-24 13:08:59

+0

是的,喬恩outtypes我們所有。然而,我更喜歡我們的答案,更多的打算揭示:-) – Steven 2011-04-24 13:11:05