【问题标题】:LINQ find average from CSV objectsLINQ 从 CSV 对象中查找平均值
【发布时间】:2014-11-10 16:11:18
【问题描述】:

我有一个包含股票信息的 CSV(我有一个名为 stockValuesDailyValues 对象列表),我需要从中提取。它看起来像这样:

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

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

【问题讨论】:

  • 为什么不简单地将Predicate&lt;T&gt; 传递给您的TakeWhile 子句?每个谓词可以是不同的年份。还是你真的想多年执行一次你的方法?
  • 您想同时获取所有年份的平均值还是仅获取特定年份的平均值?
  • 我不知道Predicate&lt;T&gt; 做了什么,所以我必须查一下,但我确实需要打印一行说明每年的平均值,如果这能回答您的问题。
  • @juharr 打印一行,说明每个特定年份的平均值是的。
  • 以下答案应该适用于所有日期。

标签: c# linq csv


【解决方案1】:

你可以试试这样的:

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

这将返回每年的平均值,请参阅fiddle

【讨论】:

  • 你不需要GroupBy中的匿名类。
【解决方案2】:
var groupedResults = stockValues.GroupBy(m => m.Date.Year)
                               .Select(g => new {
                                  year = g.Key,
                                  avg = g.Average(s => s.Volume)
                               });


foreach (var res in groupedResults)
   Console.WriteLine("{0} average : {1}", res.year, res.avg));

【讨论】:

  • 应该是 stockValues 而不是 values2013 因为该变量是具有所有值的变量。
猜你喜欢
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
相关资源
最近更新 更多