难以理解看似简单的问题。我有
var SummaryCollection = (from n in ...long criteria with group by clause)
into g select new
{ MonthYear = g.Key,
Amount = g.Sum(p=>p.Amount)}).OrderBy(p=>p.MonthYear);
}
我现在获得的数据看起来像这样
Jan2009 $100
Feb2009 $134
... and so on
最后我有
decimal avgAmount = (from x in SummaryCollection select x.Amount).Average();
我现在需要获得用户在文本框中输入N的最后N个月的平均值。 请告知如何使用Linq从订购的集合中获取平均最后N个。谢谢
答案 0 :(得分:3)
如果您知道集合中的项目数(或使用Count()
),您可以跳过第一个Count - N
项:
decimal avgAmount = SummaryCollection.Skip(SummaryCollection.Count() - N)
.Select(x => x.Amount)
.Average();
答案 1 :(得分:3)
我创建了一个使用Queue<T>
的扩展方法,该方法不需要在序列上调用.Count
,也不需要多次迭代。
public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> @this, int n) {
var queue = new Queue<T>(n + 1);
foreach (var element in @this) {
queue.Enqueue(element);
if(queue.Count > n) queue.Dequeue();
}
return queue;
}
要使用它,如果您的列表名为sequence
,请致电sequence.TakeLast(n)
以获取最后n
条记录。