返回满足特定条件的列表元素

本文关键字:列表元素 特定条件 满足 返回 | 更新日期: 2023-09-27 18:02:35

我有一个类:

class Point
{
    double X, Y;
}

List<Point>,说我想要Point,其中Point.X + Point.Y在列表中最大。我将如何在LINQ中做到这一点?

返回满足特定条件的列表元素

这将是一种方式(尽管无论如何都不是最优的(:

List<Point> list = ...;
Point maxPoint = list.OrderByDescending(p => p.X + p.Y).First();

另一种应该执行得更好的方法是修改Point类以实现IComparable<T>,如下所示:

class Point : IComparable<Point>
{
    double X, Y;
    public int CompareTo(Point other)
    {
        return (X + Y).CompareTo(other.X + other.Y);
    }
}

这样你就可以简单地做:

List<Point> list = ...;
Point maxPoint = list.Max();

我将添加Microsoft Reactive Team的交互式扩展(NuGet"Ix Main"(。他们有一堆非常有用的IEnumerable<T>扩展。

这就是你需要的:

Point max = points.MaxBy(p => p.X + p.Y).First();

没有现成的东西。你可以做:

Point theMax = null;
ForEach(x => theMax = (theMax == null || x.X + x.Y > theMax.X + theMax.Y ? x : theMax));

但显然这不是很好看。

你真正想要的是写自己的扩展方法,而写自己的,我的意思是无耻地窃取MoreLinq的(https://code.google.com/p/morelinq/source/browse/MoreLinq/MaxBy.cs)。您也可以使用:Install-Package MoreLinq.Source.MoreEnumerable.MaxBy

然后你可以做:var theMax = points.MaxBy(x => x.X + x.Y);

记住,林克的美妙之处/力量在于,归根结底,它都是扩展方法。别忘了,你总是可以写自己的东西来做你需要的事情。当然,MoreLinq项目通常有你需要的东西。这是一个很棒的图书馆。

var maxValue = list.Max(m => m.X + m.Y);
var maxPoint = list.Where(p => p.X + p.Y == maxValue).FirstOrDefault();

对于高地人来说。。

var largestPoints = list.Where(p => p.X + p.Y == maxValue);

领带。