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

C# 在对象列表中查找最小值和最大值,但最小对象必须早于最大值,c#,numbers,where,C#,Numbers,Where,抱歉。。。我不太擅长编码,但这就是原因 基本上我有一个类的列表,我想得到它的最小值和最大值。让我感到困惑的是,我需要最小值和最大值按时间顺序排列。希望这幅画能说明我的意思 如上所示,第一个值实际上是最大值,但最小值不是另外两个增量 所以我试图构造一个where语句,但我不知道如何混合类变量类型来正确查询。。。另外,如何注意最小值的日期必须早于最大值,而不知道最大值(反之亦然) 显然,下面的代码根本不起作用,获取最小/最大值的逻辑也有缺陷,但希望它有助于理解我要做的事情 public stati

抱歉。。。我不太擅长编码,但这就是原因

基本上我有一个类的列表,我想得到它的最小值和最大值。让我感到困惑的是,我需要最小值和最大值按时间顺序排列。希望这幅画能说明我的意思

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

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

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

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; }
}
publicstaticminmax-MinandMax(List-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);
//将最小值和最大值放入变量中
最小值结果=新的最小值();
结果:Max=last12max;
结果:最小值=最后12分钟;
返回结果;
}
公共阶级价值观
{
公共对象Id{get;set;}
公共日期时间日期{get;set;}
公共双值{get;set;}
公共字符串名称{get;set;}
}

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

var min = CutList.OrderBy(x => x.Value).First();
var max = CutList.OrderByDesc(x => x.Value).First(a => a.Date > min.Date);
之后,我将确定最大日期-必须是
>min.date
OrderByDesc
首先获取最高值

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

更新。。您必须按
排序,而不是按
日期

使用LINQ,
聚合
方法允许您逐步浏览列表,并通过自定义规则在一次过程中聚合它。您的规则如下所示:

(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);

你知道当
min
max
都有一个值(即不为
null
)时,你会得到一个结果。

那么,逻辑应该是:找到所有对象的绝对最小值,然后按时间顺序搜索所有跟随它的对象的最大值。请在您尝试后更新您的帖子。您希望首先获得最小值。然后找到两个最大值。一个比分钟早,一个比分钟晚。现在我觉得自己像个白痴。我在考虑是否在最小值之后没有最大值(如下降趋势等),但错误处理将处理该问题。。。哈,谢谢!在这种情况下,如果没有更多的有效值,请使用
FirstOrDefault
返回
null