2015-08-28 36 views
1

我有一個CLAS:C#列表<T>計算相加平均每個項目與前面的

public class Item 
{ 
    public Item() 
    { 

    } 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public decimal Value { get; set } 
    public decimal Average { get; set; } 
} 

如果我創建這個列表:

List<Item> items = new List<Item>(); 

如何設置的平均物品的價值如下:

  • 第一項平均值=它自己的值
  • 第二項平均值=第一項的平均值+第二項值
  • 第三項平均值=第一項的平均值+第二項+第三項值的值
  • 等等。

回答

3
decimal sum = 0; 
items = items.Select((v, i) => 
     { 
      sum += v.Value; 
      v.Average = sum/(i + 1); 
      return v; 
     }).ToList(); 
1
for (int i = 0; i < items.Count; i++) 
{ 
    items[i].Average = items.Take(i + 1).Average(item => item.Value); 
} 
+0

這可能是正確的,並且可以是適合於小組輸入值的,但不會很好地擴展,因爲它的性能會爲O(n^2) – ClickRick

+0

完全正確。 :)使用'Aggregate'函數的數千個元素可能會更好。 – taffer

+0

如果你想要LINQ的答案,你應該使用Enumerable.Range。請考慮以性能考慮編輯帖子。 –

3

在這裏你去:

public static class helper { 
    public static IEnumerable<double> doSomething(this IEnumerable<int> source) 
    { 
     double sum = 0; 
     int count = 0; 
     foreach(var item in source) 
     { 
      sum += item; 
      count++; 
      yield return (sum/count); 
     } 
    } 
} 

測試:

var res = new List<int> { 1,2,3,4,5,6,7,8,9,10}; 
res.doSomething().Dump(); 

給出了這樣的:

1 
1.5 
2 
2.5 
3 
3.5 
4 
4.5 
5 
5.5 
+0

無論是參數和結果應該是類型'的IEnumerable '的,以適合的問題。 – ClickRick