为了账号安全,请及时绑定邮箱和手机立即绑定

Linq:如何对集合中所有对象的属性执行.max(),并返回最大值[的对象

Linq:如何对集合中所有对象的属性执行.max(),并返回最大值[的对象

C#
慕标琳琳 2019-07-09 10:34:15
Linq:如何对集合中所有对象的属性执行.max(),并返回最大值[的对象我有一个有两个int属性的对象列表。该列表是另一个Linq查询的输出。对象:public class DimensionPair  {     public int Height { get; set; }     public int Width { get; set; }}我想在列表中找到并返回其中最大的对象Height财产价值我可以设法获得最高值的Height值,而不是对象本身。我能和Linq一起做这个吗?多么,怎样?

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

我们有一个可拓法才能做到这一点MoreLINQ..您可以查看那里的实现,但基本上它是迭代数据的情况,记住我们到目前为止看到的最大元素以及它在投影下产生的最大值。

在你的情况下,你会做这样的事情:

var item = items.MaxBy(x => x.Height);

这比这里提出的任何解决方案都要好,除了Mehrdad的第二个解决方案(基本上与MaxBy):

  • 它是O(N)不像

    先前接受的答复

    ,它在每次迭代中找到最大值(使其为O(n^2)。
  • 排序解为O(N Logn)
  • 拿着

    Max

    值,然后找到带有该值的第一个元素是O(N),但在序列上迭代两次。在可能的情况下,您应该以单程方式使用LINQ。
  • 与聚合版本相比,阅读和理解要简单得多,并且每个元素只计算一次投影


查看完整回答
反对 回复 2019-07-09
?
萧十郎

TA贡献1815条经验 获得超13个赞

这需要一个排序(O(N)原木但非常简单和灵活。另一个优势是能够与LINQtoSQL一起使用它:

var maxObject = list.OrderByDescending(item => item.Height).First();

注意,这具有枚举list只重复一次。虽然这可能并不重要listList<T>在此期间,这一点并没有改变,这可能是武断的事。IEnumerable<T>物品。没有什么能保证序列不会在不同的枚举中发生变化,因此多次执行的方法可能是危险的(而且效率很低,取决于序列的性质)。然而,对于大序列,它仍然是一个不太理想的解决方案。我建议你自己写MaxObject如果有大量的项可以在一次传递中完成,而不需要排序和其他任何内容,则可以手动扩展(O(N):

static class EnumerableExtensions {
    public static T MaxObject<T,U>(this IEnumerable<T> source, Func<T,U> selector)
      where U : IComparable<U> {
       if (source == null) throw new ArgumentNullException("source");
       bool first = true;
       T maxObj = default(T);
       U maxKey = default(U);
       foreach (var item in source) {
           if (first) {
                maxObj = item;
                maxKey = selector(maxObj);
                first = false;
           } else {
                U currentKey = selector(item);
                if (currentKey.CompareTo(maxKey) > 0) {
                    maxKey = currentKey;
                    maxObj = item;
                }
           }
       }
       if (first) throw new InvalidOperationException("Sequence is empty.");
       return maxObj;
    }}

并与以下内容一起使用:

var maxObject = list.MaxObject(item => item.Height);


查看完整回答
反对 回复 2019-07-09

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号