在对象列表中查找最小值和最大值,但最小对象必须早于最大值

时间:2017-12-08 06:47:02

标签: c# numbers where

道歉......我在编码方面并不是很出色,但现在就去了。

基本上我有一个班级列表,我希望得到最小和最大。绊倒我的部分是我需要min和max按时间顺序排列。希望这幅画有助于展示我的意思。

Graph of object with date and value

如上所示,第一个值实际上是最大值,但最小值不是另外两个增量。

所以我试图构造一个where语句,但我无法弄清楚如何混合类变量类型来正确查询...另外如何注意min的日期必须早于max ,但还不知道最大值(反之亦然)。

显然,下面的代码根本不起作用,获取最小/最大值的逻辑是有缺陷的,但希望它有助于理解我尝试做的事情......

public static MinMax MinandMax(List<ValueHistoric> InputList, int take)
{
    InputList.Reverse();
    var CutList = InputList.Take(take);
    var CutListMax = CutList.Where(a => a.Value == CutList.Max(b => b.Value) && a.Date > CutList.Min.Date);
    var CutListMin = CutList.Where(a => a.Value == CutList.Min(b => b.Value) && a.Date < CutList.Max.Date>);

    //Put Min and Max into variables here

    MinMax results = new MinMax();
    results.Max = last12max;
    results.Min = last12min;
    return results;
}

public class ValueHistoric
{
    public ObjectId Id { get; set; }
    public DateTime Date { get; set; }
    public double Value { get; set; }
    public string Name { get; set; }
}

2 个答案:

答案 0 :(得分:0)

我首先确定最小值OrderBy以获得最低值

var min = CutList.OrderBy(x => x.Value).First();

之后我会确定最长日期 - 必须是> min.DateOrderByDesc首先获得最高价值

var max = CutList.OrderByDesc(x => x.Value).First(a => a.Date > min.Date);

更新 ..您必须按Value订购,而不是Date

答案 1 :(得分:0)

使用LINQ,Aggregate方法允许您逐步浏览列表并通过一次自定义规则聚合它。你的规则看起来像这样:

(double?, double?) AggregateMinMax((double? Min, double? Max) current,
    double next)
{
    if ((current.Min == null) || (current.Min.Value > next)) {
        return (next, null);
    }
    else if ((current.Max == null) || (next > current.Max.Value)) {
        return (current.Min, next);
    }
    else {
        return current;
    }
}

(double? min, double? max) = CutList.OrderBy(value => value.Date).Select(value => value.Value)
    .Aggregate(((double?)null, (double?)null), AggregateMinMax);

minmax都有值(即不是null)时,您知道结果。