返回满足特定条件的列表元素
本文关键字:列表元素 特定条件 满足 返回 | 更新日期: 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);
领带。