2

我有一个名为 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 的经验,并且似乎无法完全正确地围绕它进行思考(我确信这很简单,我只是做得不对)。谁能正确引导我?

一如既往,提前感谢大家!

4

2 回答 2

6

您可以使用moreLINQ库中的MaxByMinBy方法。

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();
于 2013-11-02T22:56:15.290 回答
2

我认为您必须分两步执行:

var mx = stockValues.Max(sv => sv.High);
var result = stockValues.Where(sv=>sv.High == mx);

您可以使用FirstOrDefault而不是Where如果您只想要 1 个项目

更新

如果您只想要一件物品,我认为使用Aggregate最好的选择

var result = stockValues.Aggregate((a, b) => b.High > a.High ? b : a);

要获得多个项目(相同的 max 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;
                                 });
于 2013-11-02T22:56:07.033 回答