以下是我的例子:
class test{
public DateTime dt;
public double value;
public int id;
}
我有:
IEnumerable<Test> TestList;
我希望从中选择行,按ID分组,使用max(dt)。
我的疑问:
var q = from p in TestList
group p by p.id
into g
select new { id = g.Key, dt = g.Max(w => w.dt) });
结果我有{id_param,dt}的anonyoumus类,但是我也希望字段“值”,如{id,dt,value},我该怎么办?
答案 0 :(得分:0)
您必须按未聚合的所有字段进行分组。所以价值需要总结或分组。
尝试:
var result = TestList
.GroupBy(t => t.id)
.Select(g => new { id = g.Key, g.OrderByDescending(c => c.dt).First().dt, g.OrderByDescending(c => c.dt).First().value });
答案 1 :(得分:0)
根据评论和问题,您希望:对于每个不同的ID,具有最大dt
的实例。
我会添加一个帮助方法:MaxBy
,它允许根据函数 1 的值选择整个对象:
public static T MaxBy<T,TValue>(this IEnumerable<T> input, Func<T,TValue> projector)
where TValue : IComparable<TValue> {
T found = default(T);
TValue max = default(TValue);
foreach (T t in input) {
TValue p = projector(t);
if (max.CompareTo(p) > 0) {
found = t;
max = p;
}
}
return found;
}
然后查询变为:
var q = from p in TestList
group p by p.id into g
select g.MaxBy(w => w.dt);
NB。 MaxBy
的此实现仅适用于被比较成员的值大于其类型默认值的对象(例如int
:更高比零)。更好地实现MaxBy
将手动使用枚举器,并直接从输入的第一个元素初始化found
和max
变量。
1 如果您使用的是Reactive Extensions(Rx),它将包含在System.Interactive
程序集中。