【问题标题】:Finding the min and max values in a list of objects, but where the min object must be older than max在对象列表中查找最小值和最大值,但最小值对象必须早于最大值
【发布时间】:2017-12-08 06:47:01
【问题描述】:

抱歉...我不太擅长编码,但还是这样吧。

基本上我有一个类的列表,我想获得它的最小值和最大值。让我绊倒的部分是我需要按时间顺序排列最小值和最大值。希望这幅图有助于说明我的意思。

Graph of object with date and value

正如您在上面看到的,第一个值实际上是最大值,但最小值不是另外 2 个增量。

所以我试图构造一个 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; }
}

【问题讨论】:

  • 那么,逻辑应该是:找到所有对象的绝对最小值,然后在按时间顺序跟随它的所有对象中搜索最大值。请在尝试后更新您的帖子。
  • 你想先得到最小值。然后找到两个最大值。比最小值早一个,比最小值晚一个。

标签: c# numbers where


【解决方案1】:

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

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

之后我会确定最大日期 - 必须是 &gt; min.Date ,OrderByDesc先取最高值

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

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

【讨论】:

  • 现在我觉得自己像个白痴。我在考虑是否在最小值之后没有最大值(即下降趋势等),但错误处理将处理这个问题......哈哈,谢谢!
  • 在这种情况下使用FirstOrDefault返回null如果没有更多的有效值期望
【解决方案2】:

使用 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);

当min 和max 都有一个值(即不是null)时,你知道你有一个结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-22
    • 2018-04-08
    • 2014-12-01
    • 2015-04-22
    • 2012-09-16
    • 2015-03-15
    • 2015-06-29
    相关资源
    最近更新 更多