[英]linq query to find the objects that are the maximum and the minimum
我有一个称为stockValues的DailyValue结构的列表。 我需要找到具有最大和最小High
值的对象。
(以下是结构,仅供参考)
struct DailyValues
{
public DateTime Date { get; private set; }
public decimal Open { get; private set; }
public decimal High { get; private set; }
public decimal Low { get; private set; }
public decimal Close { get; private set; }
public decimal Volume { get; private set; }
public decimal AdjClose { get; private set; }
}
我尝试过各种各样的东西,
var mx = stockValues.Max(sv => sv.High);
仅给我正确的最大值,但不允许我访问整个对象及其成员(我想要的是实际值及其发生的日期)。 所以我尝试了这个:
var stuff = from s in stockValues
group s by s.Date into g
where g.Max(x => x.High)
select g;
但是,这只是强调g.Max(..)
并声明编译器不能隐式地将小数转换为布尔值。 尽管我不是C#的新手,但我对Linq毫无经验,似乎无法完全正确地思考一下(我确定这很简单,我做得不好)。 任何人都可以正确引导我吗?
一如既往,感谢所有提前!
您可以使用moreLINQ库中的MaxBy
和MinBy
方法。
var max = stockValues.MaxBy(sv => sv.High);
var min = stockValues.MinBy(sv => sv.High);
它们返回整个对象,而不仅仅是您尝试排序的属性的最大/最小值。
如果您希望使用标准的LINQ方法,可以执行以下操作:
var max = stockValues.OrderByDescending(sv => sv.High).First();
var min = stockValues.OrderBy(sv => sv.High).First();
或仅执行一次订购:
var ordered = stockValues.OrderBy(sv => sv.High).ToList();
var max = ordered.Last();
var min = ordered.First();
我认为你必须分两步执行:
var mx = stockValues.Max(sv => sv.High);
var result = stockValues.Where(sv=>sv.High == mx);
如果您只想要1个项目,可以使用FirstOrDefault
而不是Where
。
如果您只想要1个项目,我认为使用Aggregate
是最佳选择 :
var result = stockValues.Aggregate((a, b) => b.High > a.High ? b : a);
要获得多项(相同的最大High
),代码可以是这样的:
var results = stockValues.Aggregate(new List<DailyValues>(), (a,b)=>{
if (a.Count == 0) a.Add(b);
else if (b.High >= a[0].High){
if(b.High > a[0].High) a.Clear();
a.Add(b);
}
return a;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.