【问题标题】:Calculation on List<> subset with Linq Skip and Take使用 Linq Skip and Take 计算 List<> 子集
【发布时间】:2018-11-07 12:16:42
【问题描述】:

根据这个堆栈问题:How to calculate the rolling average of a C# array list?

您可以像这样在普通列表中取值的运行平均值:

List<int> numlist = new List<int>();
List<double> averages = Enumerable.Range(0, numlist.Count - 3).
                          Select(i => numlist.Skip(i).Take(4).Average()).
                          ToList();

我的问题:我希望能够在类列表的特定子集上做到这一点:

public class Data_Raw
{
    public DateTime DateDataRaw { set; get; }
    public double PriceRaw { set; get; }
    public double PercentageReturnsRaw { set; get; }

    public Data_Raw(DateTime _dateDataRaw,double _priceRaw, double _percentageReturnsRaw)
    {
        DateDataRaw = _dateDataRaw;                     //1
        PriceRaw = _priceRaw;
        PercentageReturnsRaw = _percentageReturnsRaw;
    }
}

List<Data_Raw> myRawData = new List<Data_Raw>();

我想在 myRawData 的类列表中计算 PriceRaw 数据的平均值。

编辑:

如果这是PriceRaw的数据:

myRawData[0].PriceRaw=2
myRawData[1].PriceRaw=3
myRawData[2].PriceRaw=4
myRawData[3].PriceRaw=5

如何得到PriceRaw后三个值的平均值,即= (3+4+5)/3 = 4。仅在myRawData.Skip之后直接可用

如果我尝试将其附加到myRawData[].PriceRaw.Skip,则跳过不可用

这个堆栈问题让我更接近,但无法弄清楚:Linq query a List of objects containing a list of object

【问题讨论】:

  • 那么问题是什么?你为什么不按照你在上面所说的方式来做呢?
  • 如果您能提供一个minimal reproducible example包括示例数据,并指定您想要实现的确切结果,那就太好了。

标签: c# linq average


【解决方案1】:

我认为如果你使用理解语法,你会更容易管理它。即:

void Main()
{
    List<Data_Raw> myRawData = new List<Data_Raw> {
       new Data_Raw(new DateTime(2018,1,1), 2, 1),
       new Data_Raw(new DateTime(2018,1,2), 3, 1),
       new Data_Raw(new DateTime(2018,1,3), 4, 1),
       new Data_Raw(new DateTime(2018,1,4), 5, 1),
       new Data_Raw(new DateTime(2018,1,5), 6, 1),
       new Data_Raw(new DateTime(2018,1,6), 7, 1),
       new Data_Raw(new DateTime(2018,1,7), 8, 1),
    };

    var groupSize = 3;
    var result = from i in Enumerable.Range(0, myRawData.Count() - (groupSize - 1))
                 let myGroup = myRawData.Skip(i).Take(groupSize)
                 select new
                 {
                     Values = string.Join(",", myGroup.Select(rd => rd.PriceRaw.ToString())),
                     Average = myGroup.Average(rd => rd.PriceRaw)
                 };
}

public class Data_Raw
{
    public DateTime DateDataRaw { set; get; }
    public double PriceRaw { set; get; }
    public double PercentageReturnsRaw { set; get; }

    public Data_Raw(DateTime _dateDataRaw, double _priceRaw, double _percentageReturnsRaw)
    {
        DateDataRaw = _dateDataRaw;                     //1
        PriceRaw = _priceRaw;
        PercentageReturnsRaw = _percentageReturnsRaw;
    }
}

【讨论】:

    【解决方案2】:

    只需在numList 中选择您需要的值(见第一行):

    var numList = myRawData.Select(x => x.PriceRaw).ToList();
    List<double> averages = Enumerable.Range(0, numlist.Count - 3).
                          Select(i => numlist.Skip(i).Take(4).Average()).
                          ToList();
    

    另一种方法可能是:

    List<double> averages = Enumerable.Range(0, myRawData.Count - 3).
                          Select(i => myRawData.Skip(i).Take(4).Select(x => x.PriceRaw).Average()).
                          ToList();
    

    【讨论】:

    • 谢谢我会看到阅读教程,但是你的例子不起作用..
    • 抱歉,已修复
    • 这只是违背了拥有一个包含所有数据的类列表的目的,而不是几个普通列表......它打破了类列表以访问数据
    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2013-11-25
    • 2011-11-13
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多