C# 平均3个IEnumerables

C# 平均3个IEnumerables,c#,linq,ienumerable,C#,Linq,Ienumerable,我需要平均3个IEnumerable集合,并创建一个新的IEnumerable,结果如下: 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()//retu

我需要平均3个IEnumerable集合,并创建一个新的IEnumerable,结果如下:

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、result2、result3将具有相同数量的元素(在本例中为4,但实际上它的范围可以达到1500)

  • 结果中的每个元素对应于结果的平均值,即在result4集合中,第一个元素的平均值为1,3,2,分别对应于result1、result2、result3中第一个元素的平均值,依此类推

  • 结果集合的小数位数应四舍五入为2

一个明显的答案是迭代集合中的每个元素,并手动(即通过for循环)在结果集合中创建元素,但是我希望避免这种情况,因为每个集合中的结果将接近1500个元素,并且希望使用LINQ进行某种延迟评估

你能帮我指点一下吗

干杯,
-Mike

如果您使用的是.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。在这里,我使用了双精度,但另一种选择是使用十进制——这取决于值的真正含义。

实现这一点的一种方法是编写一个方法,该方法采用列表列表,并执行必要的工作。比如:

 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;
     }
 }
实例:


注:不包括四舍五入,原因与提到的Jon相同;舍入是一个格式化/显示步骤。

想象一个fibonacci数列,每个集合中数列的前1000个数字,即result1、result2和result3,每个都包含该数列。我相信你会用小数点来表示结果4,对吗?迈克:老实说,我不知道。那里没有“单位”,真的。。。用“身高”和“工资”等具体数字更容易判断。你能不能把总数退出来,而不是除以三?这是相同的数据,只是缩放,毕竟…这并不需要将所有数据都拉入内存,而实际上并不需要它。这一切都可以通过流媒体方式完成。
var result4 = AverageOfLists(result1,result2,result3);