当前位置 : 主页 > 编程语言 > c语言 >

c# – 计算具有相同项目计数的多个IEnumerable的平均值

来源:互联网 收集:自由互联 发布时间:2021-06-25
假设我们有多个相同项目计数的IEnumebles var multipleEnumerables = new[]{ new[] { 10, 20, 30 } new[] { 11, 21, 31 } new[] { 12, 22, 32 } new[] { 13, 23, 33 }} 如何获得使用LINQ的平均值,这将产生以下结果: new[]
假设我们有多个相同项目计数的IEnumebles

var multipleEnumerables = new[]
{
    new[] { 10, 20, 30 }
    new[] { 11, 21, 31 }
    new[] { 12, 22, 32 }
    new[] { 13, 23, 33 }
}

如何获得使用LINQ的平均值,这将产生以下结果:

new[] { 11.5, 21.5, 31.5 }

可枚举的数量可以变化(即,不固定为四).

每个可枚举项中的项数可能不同(即不固定为三个),但对于该特定实例的所有可用数据都是相同的.

更新以响应编辑

如果你有IEnumerable< IEnumerable< Item>>你可以使用这样的东西:

IEnumerable<IEnumerable<Test>> multipleEnumerables = new[] {
    new [] { new Test {  Value = 10 }, new Test {  Value = 20 } },
    new [] { new Test {  Value = 11 }, new Test {  Value = 21 } }
};

var averages = multipleEnumerables
    .SelectMany(e => e.Select((v, i) => new { Index = i, Item = v }))
    .GroupBy(e => e.Index)
    .Select(e => e.Select(v => v.Item.Value).Average())
    .ToArray();

如果您有一个简单的IEnumerable< IEnumerable< int>>,请将.Select行更改为:.Select(e => e.Select(v => v.Item).Average())(但基于您的评论,我认为情况并非如此).

>使用.SelectMany将列表展平为包含项目的对象及其子数组索引(因此10和11将具有索引0等).
>按指数分组.
>使用.Select从每个分组中选择平均值.

Try it online

Try it online with question data

原始答案

您可以使用.Zip组合两个列表并计算平均值:

var averages = items1
                  .Zip(items2, (a, b) => (a+b)/2.0)
                  .ToArray();

Try it online

网友评论