【发布时间】:2011-03-31 18:53:39
【问题描述】:
我有一个数据集表,我想按列 MOID 对其进行分组,然后在该组中选择列 radi 的最大值的行。
谁能告诉我如何通过 LINQ to dataset 做到这一点?
【问题讨论】:
标签: linq dataset linq-group
我有一个数据集表,我想按列 MOID 对其进行分组,然后在该组中选择列 radi 的最大值的行。
谁能告诉我如何通过 LINQ to dataset 做到这一点?
【问题讨论】:
标签: linq dataset linq-group
这适用于一个查询!
public static T WithMax<T, TValue>(this IEnumerable<T> source, Func<T, TValue> keySelector)
{
return source.OrderByDescending(keySelector).FirstOrDefault();
}
【讨论】:
这是未经测试的,但我认为这样的事情应该可以工作:
var qry = from m in [YourDataSource]
group p by m.MOID into grp
select grp.OrderByDescending(a => a.RADI).First();
【讨论】:
虽然 Barry 发布的解决方案应该可以工作(有一些修复),但它是次优的:您不需要对集合进行排序来查找具有字段最大值的项目。我写了一个WithMax扩展方法,它返回具有指定函数最大值的项:
public static T WithMax<T, TValue>(this IEnumerable<T> source, Func<T, TValue> selector)
{
var max = default(TValue);
var withMax = default(T);
bool first = true;
var comparer = Comparer<TValue>.Default;
foreach (var item in source)
{
var value = selector(item);
int compare = comparer.Compare(value, max);
if (compare > 0 || first)
{
max = value;
withMax = item;
}
first = false;
}
return withMax;
}
它只对集合进行一次迭代,这比仅仅为了获得第一项而对其进行排序要快得多。
然后你可以如下使用它
var query =
from row in table.AsEnumerable()
group row by row.Field<int>("MOID") into g
select g.WithMax(r => r.Field<int>("radi"));
【讨论】: