我有一个这样的排序列表;
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年。(当然我的真实情况有更多的价值)
我看到排序列表有一个名为"Avarage"的扩展方法; https://msdn.microsoft.com/en-us/library/bb534965(v=vs.110).aspx
但我找不到任何明确的例子。我喜欢 VB.NET,但也欢迎 C# 示例...
我知道我需要实现一个函数,但我不知道怎么做。MSDN 不提供任何示例。另外,这是最好/最快的方法吗?,或者有更好的选择......
提前感谢...
更新:我试过这个;
Dim MyAverage As Double = MeasuredValues.Average(Function(measure) CDate(measure.Key) >= ThisStepBeginTime And CDate(measure.Key) <= ThisStepEndTime)
但它只提供偶尔的 -0,1
这种"单行功能"对我来说是新的,我做错了什么?
更新 2:我的例子是真正问题的一个过于简单的例子。我正在尝试绘制一个图表,其中每个像素代表一个时间跨度。喜欢这个;
For XCounter As Integer = 0 To MyBase.Width
Dim ThisStepBeginTime As DateTime = First.AddTicks(XCounter * TimeStep.Ticks)
Dim ThisStepEndTime As DateTime = First.AddTicks((XCounter + 1) * TimeStep.Ticks)
For Each MySerie In Me.AllSeries.Values
Dim MyAverage As Double = MySerie.Where(Function(measure) CDate(measure.Key) >= ThisStepBeginTime And CDate(measure.Key) <= ThisStepEndTime).Average(Function(measure) measure.Value)
e.Graphics.DrawLine(Pens.Red, XCounter, CInt((Me.Height / MySerie.HighestValue) * MyAverage), XCounter, 0)
Next
Next
这导致;
Sequence contains no elements
因为某些步骤没有值....
我认为您可以先过滤列表,然后获得平均值:
MeasuredValues _
.Where(Function(measure) cDate(measure.Key) >= dateFrom And cDate(measure.Key) <= dateTo) _
.Average(Function(measure) measure.Value)
关于更新 2:
如果我正确理解新问题,如果Where
不返回任何元素,您将在Average
上出现错误。我知道您可以在两者之间添加.DefaultIfEmpty
,但我不知道这会如何影响Average
功能:
MeasuredValues _
.Where(Function(measure) cDate(measure.Key) >= dateFrom And cDate(measure.Key) <= dateTo) _
.DefaultIfEmpty() _
.Average(Function(measure) measure.Value)
我希望DefaultIfEmpty
Of(DateTime, double)
返回一个空元素,因此平均为 0