VB.NET 从排序列表(sortedlist.average)的值范围中获取平均值



我有一个这样的排序列表;

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

最新更新