Linq集团有了

时间:2010-10-06 08:56:11

标签: .net linq

以下是我的例子:

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},我该怎么办?

2 个答案:

答案 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将手动使用枚举器,并直接从输入的第一个元素初始化foundmax变量。


1 如果您使用的是Reactive Extensions(Rx),它将包含在System.Interactive程序集中。