列表<>子集的计算与Linq跳过和采取

问题描述 投票:0回答:2

如根据这个堆栈问题。如何计算C#数组列表的滚动平均值?

你可以像这样取一个普通列表中的值的运行平均值。

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>();

我想计算一下 PriceRaw 数据,在类列表中,它是 myRawData.

EDIT:

如果这是数据 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查询一个包含一个对象列表的对象列表。

c# linq average
2个回答
0
投票

只需选择你需要的值到你的 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();

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.