C# LINQ从CSV对象中查找平均值

C# LINQ从CSV对象中查找平均值,c#,linq,csv,C#,Linq,Csv,我有一个CSV,里面有股票信息(我有一个名为stockValues的DailyValues对象列表),我需要从中提取。看起来是这样的: Date,Open,High,Low,Close,Volume,Adj Close 2012-11-01,77.60,78.12,77.37,78.05,186200,78.05 2012-10-31,76.96,77.75,76.96,77.47,290700,77.47 //and so on 基本上,我需要用LINQ在CSV中找到每年的平均数量。我可以

我有一个CSV,里面有股票信息(我有一个名为
stockValues
DailyValues
对象列表),我需要从中提取。看起来是这样的:

Date,Open,High,Low,Close,Volume,Adj Close
2012-11-01,77.60,78.12,77.37,78.05,186200,78.05
2012-10-31,76.96,77.75,76.96,77.47,290700,77.47  //and so on
基本上,我需要用LINQ在CSV中找到每年的平均数量。我可以做,但它太草率了,只能用一年时间,所以我不得不复制这个片段很多次,每年都这样做(它有1993-2012年)。以下是我所拥有的:

List<DailyValues> values2012 = stockValues.TakeWhile(n => n.Date.Year == 2012).ToList();
List<decimal> sum2012 = (from s in values2012
                         select s.Volume).ToList();
decimal average2012 = 0;
foreach(decimal el in sum2012)
{        
    average2012 += el;
}
average2012 /= sum2012.Count();

average2012 = decimal.Round(average, 2);

Console.WriteLine("2012 Average: " + average2012);
List values 2012=stockValues.TakeWhile(n=>n.Date.Year==2012).ToList();
列表sum2012=(从值2012中的s开始)
选择s.Volume).ToList();
十进制平均数2012=0;
foreach(2012年夏季的十进制el)
{        
平均2012+=el;
}
average2012/=sum2012.Count();
average2012=小数点后四舍五入(平均值为2);
Console.WriteLine(“2012年平均值:+2012年平均值”);

所以,再一次,这很好,但我不想每年都这样做。有人知道简化我的问题的方法吗?

你能试试以下方法吗:

 var groupedValues = stockValues.GroupBy(n => n.Date.Year)
                   .Select (g => new {
                       Average = g.Average(p => p.Volume), 
                       Year = g.Key
                    });

这将返回每年的平均值,请查看此

您可以尝试以下方法吗:

 var groupedValues = stockValues.GroupBy(n => n.Date.Year)
                   .Select (g => new {
                       Average = g.Average(p => p.Volume), 
                       Year = g.Key
                    });

这将返回每年的平均值,请参见此

为什么不简单地将一个
谓词
传递给您的
TakeWhile
子句?每个谓词可以是不同的年份。或者你真的想在所有年份执行一次方法吗?你想在同一时间获得所有年份的平均值还是只获得某一特定年份的平均值?我不知道
谓词的作用是什么,所以我必须查找它,但我确实需要打印一行,说明每年的平均值,如果这回答了您的问题。@juharr打印一行,说明每个特定年份的平均值是。以下答案适用于所有日期。为什么不简单地将
谓词
传递给您的
TakeWhile
子句?每个谓词可以是不同的年份。或者你真的想在所有年份执行一次方法吗?你想在同一时间获得所有年份的平均值还是只获得某一特定年份的平均值?我不知道
谓词的作用是什么,所以我必须查找它,但我确实需要打印一行,说明每年的平均值,如果这回答了您的问题。@juharr打印一行,说明每个特定年份的平均值是。以下答案适用于所有日期。应为
stockValues
而不是
values2013
,因为该变量包含所有值。应为
stockValues
而不是
values2013
作为该变量是包含所有值的。您不需要
GroupBy
中的匿名类。您不需要
GroupBy
中的匿名类。