Linq通过比较选择不同的值
我有一个物品清单。例如,Linq通过比较选择不同的值,linq,Linq,我有一个物品清单。例如,列表,其中包含字符串(denom)和int(year)。 如果列表包含: "Quarter", 1954 "Quarter", 1990 "Penny", 1925 "Nickel", 1900 "Nickel", 2000 如何获得一个结果列表,其中仅包含最近一年的唯一值?例如: "Quarter", 1990 "Penny", 1925 "Nickel", 2000 您可以通过按名称分组,然后排序并获取第一个结果,或者使用类似于MaxByfrom的方法: 或
列表
,其中包含字符串(denom)和int(year)。
如果列表包含:
"Quarter", 1954
"Quarter", 1990
"Penny", 1925
"Nickel", 1900
"Nickel", 2000
如何获得一个结果列表,其中仅包含最近一年的唯一值?例如:
"Quarter", 1990
"Penny", 1925
"Nickel", 2000
您可以通过按名称分组,然后排序并获取第一个结果,或者使用类似于
MaxBy
from的方法:
或
您可以使用
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示例中的“max-grouped:我的键入速度也没有JonSkeet快:)是的,Jon的键入速度比我们所有人都快。不过,我更喜欢我们的答案,更具启发性:-)@Steven:另一方面,这只起作用,因为你只知道名称和年份-如果有其他财产不涉及分组或订购,它将不起作用。谢谢Jon。我用了你的第二个答案。虽然我了解基本的sql概念,但我在哪里可以找到有关如何工作的信息?例如.Select语句及其在.OrderBy中引用x.Year的方式?@tim:GroupBy结果中的每个元素都是一组同名的硬币。如果按年份(降序)对每个组进行排序,那么排序序列中的第一个条目就是该名称的最新硬币。我(仅)得到了分组的概念,并在orderby之后选择最大值,就像在sql中一样。令人困惑的是linq条款。所以GroupBy生成了一个集合,它们在其中进行分组,但我对OrderByDescending子句如何对当前集合进行具体引用感到有点困惑。@tim:GroupBy生成了一系列组。Select作用于每个元素,即每个组。OrderBy位于select中。
var query = coins.GroupBy(x => x.Name)
.Select(g => g.OrderByDescending(x => x.Year).First());
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)
};
var query = from coin in myList
group coin by coin.Name into grouped
select new
{
Name = grouped.Key
Year = grouped.Max(x => x.Year)
};