【问题标题】:Linq to dataset select row based on max value of columnLinq到数据集根据列的最大值选择行
【发布时间】:2011-03-31 18:53:39
【问题描述】:

我有一个数据集表,我想按列 MOID 对其进行分组,然后在该组中选择列 radi 的最大值的行。

谁能告诉我如何通过 LINQ to dataset 做到这一点?

【问题讨论】:

    标签: linq dataset linq-group


    【解决方案1】:

    这适用于一个查询!

    public static T WithMax<T, TValue>(this IEnumerable<T> source, Func<T, TValue> keySelector)
    {
        return source.OrderByDescending(keySelector).FirstOrDefault();
    }
    

    【讨论】:

      【解决方案2】:

      这是未经测试的,但我认为这样的事情应该可以工作:

              var qry = from m in [YourDataSource]
                            group p by m.MOID into grp
                            select grp.OrderByDescending(a => a.RADI).First();
      

      【讨论】:

      • 应该是OrderByDescending,而不是OrderBy(否则会返回RADI最小值的行)
      • @Thomas - 感谢您指出这一点 - 我的小错误。我已经修改了答案。
      【解决方案3】:

      虽然 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"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多