VB.NET从sortedlist的一系列值中获取平均值(sortedlist.average)

VB.NET从sortedlist的一系列值中获取平均值(sortedlist.average),vb.net,average,sortedlist,Vb.net,Average,Sortedlist,我有一个这样的分类列表 public MeasuredValues as SortedList(Of DateTime, Double) 我加入了一堆价值观。比如, MeasuredValues.add(New DateTime(2010, 1, 1),33) MeasuredValues.add(New DateTime(2011, 1, 1),13) MeasuredValues.add(New DateTime(2012, 1, 1),233) MeasuredValues.add(Ne

我有一个这样的分类列表

public MeasuredValues as SortedList(Of DateTime, Double)
我加入了一堆价值观。比如,

MeasuredValues.add(New DateTime(2010, 1, 1),33)
MeasuredValues.add(New DateTime(2011, 1, 1),13)
MeasuredValues.add(New DateTime(2012, 1, 1),233)
MeasuredValues.add(New DateTime(2013, 1, 1),331)
MeasuredValues.add(New DateTime(2014, 1, 1),732)
MeasuredValues.add(New DateTime(2015, 1, 1),123)
现在我想得到这个值的平均值,比如说从2011年到2013年。(当然,我的真实情况更有价值)

我看到sortedlist有一个名为“Avarage”的扩展方法

但我找不到任何明确的例子。我喜欢VB.NET,但也欢迎使用C#示例

我知道我需要实现一个函数,但我不知道如何实现。MSDN未提供任何示例。此外,这是最好/最快的方法吗?还是有更好的替代方法

先谢谢你


更新: 我试过这个

            Dim MyAverage As Double = MeasuredValues.Average(Function(measure) CDate(measure.Key) >= ThisStepBeginTime And CDate(measure.Key) <= ThisStepEndTime)

由于某些步骤没有值……

我认为您可以先筛选列表,然后获得平均值:

MeasuredValues _
.Where(Function(measure) cDate(measure.Key) >= dateFrom And cDate(measure.Key) <= dateTo) _
.Average(Function(measure) measure.Value)

我希望
DefaultIfEmpty
返回一个空元素
(DateTime,double)
,因此平均值为0

,您不需要调用
Where
,然后调用
Average
。您可以只调用
Average
并传递过滤器,即您将传递到
Where
的lambda,作为第二个参数。谢谢jmcillhinney,您又是对的,一如往常。(我从VBF论坛认识你)我看到你在我发布答案后编辑了你的问题@我的代码对你不起作用吗?这就是我编辑它的原因,它部分起作用,这就是我在编辑中写的;但您在编辑中提供的代码是Where和Average的组合。平均内部函数需要“返回”一个数值,但返回的是布尔值。这就是为什么我喜欢把事情分开并保持简单。。。where需要一个布尔表达式,而average需要一个数值。。。
Sequence contains no elements
MeasuredValues _
.Where(Function(measure) cDate(measure.Key) >= dateFrom And cDate(measure.Key) <= dateTo) _
.Average(Function(measure) measure.Value)
MeasuredValues _
.Where(Function(measure) cDate(measure.Key) >= dateFrom And cDate(measure.Key) <= dateTo) _
.DefaultIfEmpty() _
.Average(Function(measure) measure.Value)