【问题标题】:VB.NET get average from a range of values from a sortedlist (sortedlist.average)VB.NET 从 sortedlist (sortedlist.average) 的一系列值中获取平均值
【发布时间】:2015-06-17 06:28:06
【问题描述】:

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

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)

现在我想得到这个值的平均值,比如从 2​​011 年到 2013 年。(当然我的真实情况有更多的值)

我已经看到 sortedlist 有一个名为 '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

因为有些步骤没有价值......

【问题讨论】:

    标签: vb.net average sortedlist


    【解决方案1】:

    我觉得你可以先过滤列表,然后取平均值:

    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

    【讨论】:

    • 您无需先调用Where,然后再调用Average。您可以只调用 Average 并传递过滤器,即您将传递给 Where 的 lambda,作为第二个参数。
    • 谢谢 Jmcilhinney,你又是对的,像往常一样。 (我在 vbforums 认识你)
    • 我看到你在我发布答案后编辑了你的问题...@Lectere 我的代码对你不起作用吗?
    • 这就是我编辑它的原因,它部分工作,这就是我在编辑中写的;
    • 但您在编辑中提供的代码是 Where 和 Average 的组合。 Average 内部函数需要“返回”一个数值,但您返回的是一个布尔值。这就是为什么我喜欢拆分并保持简单... where 需要一个布尔表达式,而平均值需要一个数值...
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 2021-05-10
    • 2020-01-07
    • 2020-11-06
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多