道歉......我在编码方面并不是很出色,但现在就去了。
基本上我有一个班级列表,我希望得到最小和最大。绊倒我的部分是我需要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; }
}
答案 0 :(得分:0)
我首先确定最小值OrderBy
以获得最低值
var min = CutList.OrderBy(x => x.Value).First();
之后我会确定最长日期 - 必须是> min.Date
,OrderByDesc
首先获得最高价值
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);
当min
和max
都有值(即不是null
)时,您知道结果。