2012-02-20 76 views
0

我需要平均3 IEnumerable集合並創建一個新的IEnumerable其結果如下:平均3個IEnumerables

var result1 = GetResult1()//Returns an enumerable collection having elements 1,2,3,4 

var result2 = GetResult2()//Returns an enumerable collection having elements 3,4,2,6 

var result3 = GetResult3()//returns an enumerable collection having elements 2,5,1,6 

//I need to create a collection which has the averages of the above results as below: 

var result4 = GetResult4()//Should return 2.00,3.67,2.33,5.33. 
  • 每個結果將具有相同數目的元件,即RESULT1,結果2, result3將具有相同數量的元素(在本例中爲4,但實際上它的範圍可以爲1500)。

  • 結果中的每個元素對應於結果的平均值,即,在result4集合中,第一個元素將是平均值1,3,2,它對應於result1中的第一個元素的平均值,result2,result3因此分別。

  • 所得收集應具有小數位(即通過爲舍入成2

一個明顯的答案是通過在集合的每個元素進行迭代和手動創建所得集合中的元素循環),但是我想避免它,因爲結果將在每個集合中有近1500個元素,並且希望使用LINQ進行某種惰性評估。

請你幫助我一些指針?

乾杯, -Mike

回答

7

如果您使用.NET 4,你可以使用Enumerable.Zip效果良好這裏:

var averages = result1.Zip(result2, (x, y) => x + y) 
         .Zip(result3, (xy, z) => (xy + z)/3.0d) 
         .ToList(); 

這不會做任何四捨五入 - 這通常會更適合於格式化步驟。請注意,這些值只能以0,0.33或0.67結尾,因爲您只能除以3.這裏我使用了double,但另一種選擇是使用decimal - 這取決於值的真正含義。

+0

想象一下斐波那契數列,每個數列中前1000個數列,即result1,result2和result3,每個數列都包含該系列。我相信你會使用result4的小數,然後,對嗎? – Mike 2012-02-20 14:31:28

+0

@Mike:說實話,我不知道。在那裏沒有「單位」,真的......用「高度」和「薪水」等具體數字來說明更容易。你能把這個總和還給我們嗎,而不是把它分成三份呢?這是相同的數據,畢竟只是縮放...... – 2012-02-20 14:38:36

0

實現此目的的一種方法是編寫一個方法,該方法需要列表清單並執行必要的工作。喜歡的東西:然後

private static IEnumerable<double> AverageOfLists(params IEnumerable<double>[] values) 
{ 
    var lists = values.Select(v => v.ToList()).ToArray(); 

    for(var i=0;i<lists[0].Count;i++) 
    { 
     var sum = 0.0; 
     for(var j=0;j<lists.Length;j++) 
     { 
      sum+= lists[j][i]; 
     } 
     yield return sum/lists.Length; 
    } 
} 

用法是

var result4 = AverageOfLists(result1,result2,result3); 

活生生的例子:http://rextester.com/IGOSE98291

注:不包括爲四捨五入@喬恩同樣的理由;舍入是格式化/顯示步驟。

+0

這並不是說這就需要所有數據都被拉入內存,而不需要它。它可以全部以流媒體的方式完成。 – 2012-02-20 14:37:51