如何解决如何在列表中按顺序计算每个元素的差异,然后在LINQ中获得平均值?
我有一个此类的清单:
public class DailData
{
public string Date { get; set; }
public long Number { get; set; }
}
我需要计算与上一个日期相比的每个日期的差异,然后将它们相加并除以总天数以获得平均值。我该如何用一个LINQ查询呢?
解决方法
private double calculateAvg(List<DailData> data)
{
var list1 = data.Take(data.Count() - 1);
var list2 = data.Skip(1);
var diff = list1.Zip(list2,(item1,item2) => item2.Number - item1.Number).Sum() / data.Count;
return diff;
}
,
由于我们知道源是可索引的List<T>
,所以请使用LINQ for
循环仿真:
var ans = Enumerable.Range(1,data.Count-1).Select(n => data[n].Number-data[n-1].Number).Average();
或者,使用扩展方法之一对进行扫描(scan是一种Aggregate
之类的APL运算符,但返回中间值):
// TRes combineFn(T prevValue,T curValue)
public static IEnumerable<TRes> ScanByPairs<T,TRes>(this IEnumerable<T> src,Func<T,T,TRes> combineFn) {
using (var srce = src.GetEnumerator())
if (srce.MoveNext()) {
var prev = srce.Current;
while (srce.MoveNext())
yield return combineFn(prev,prev = srce.Current);
}
}
然后,您可以轻松处理配对:
var ans2 = data.ScanByPairs((prev,cur) => cur.Number-prev.Number).Average();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。