2017-05-30 26 views
0

在列表中的每个元素现在我有DataPointSet获得第一指数的平均使用C#

public class DataPointSet { 
    public string target{ get; set; } 
    public List<List<decimal>> datapoints{ get; set; } 
} 

我追加DataPointSet使用foreach循环名单列表。

现在,在该列表中...有没有一种方法可以得到每个datapoints列表的平均值,但仅限于第一个0索引?

对象列表获取输出为JSON到底,我会用它来解释我去为:

[ 
    { 
    "target": "target_one", 
    "datapoints": [ 
     [ 
     8.0, 
     1493510400.0 
     ], 
     [ 
     8.0, 
     1493596800.0 
     ] 
    ] 
    }, 
    { 
    "target": "target_two", 
    "datapoints": [ 
     [ 
     1.0, 
     1493510400.0 
     ], 
     [ 
     1.0, 
     1493596800.0 
     ], 
     [ 
     10.0, 
     1493683200.0 
     ] 
    ] 
    }, 
] 

对于列表中的/ JSON的元素中的每一个,我想要获得datapoints密钥中所有第一个元素的平均值。

有没有一种简单的方法内置到C#中,我可以用来做到这一点,或者是我唯一的选择循环遍历每个元素,然后比较?

任何帮助将是伟大的,谢谢!

+0

如果我理解正确,您希望SUM(DataPointSet1.DataPoints [0] + DataPointSet2.DataPoints [0] .... + DataPointSetN.DataPoints [0])/ N ?? –

+0

'十进制平均值= data.datapoints.Select(element => element.First())。Average();' –

回答

2

当然,你有LINQ的简单方法。

所以,你必须:

List<DataPointSet> dataPointSets = ...; 

然后,你可以找到答案,此代码:

foreach (var dataPointSet in dataPointSets) 
{ 
    var average = dataPointSet.datapoints 
     .Average(innerList => innerList.First()) 
} 
+0

非常感谢! –

1

您可以在列表中使用Linq Average方法。

using System.Linq; 

List<decimal> firsts = datapoints.ForEach(i=>i.First()); 
firsts.Average(); 
+0

但是,这是否会为每个数据点集中的第一个元素索引?第二个是时间戳,不应该被平均。 –

+0

对不起,没有意识到你有一个列表和东西的名单。我更新了每个列表中的第一个项目并将其分配给它自己的列表。然后平均该清单。 –

+0

这看起来现在编辑后 –

2

这是一个很好的用例LINQ。如果你知道嵌套列表总是有元素,你可以使它变得快速和肮脏。感谢@JoePhillips的一些更正。

list 
    .SelectMany(x => x.datapoints) 
    .Average(x => x.First()); 

注意,该查询得到的8.0,8.0,1.0,1.0和10.0的平均值。

+0

我相信'SelectMany()'会改善这一点更多 –

+0

@JoePhillips更新以包含您的建议。它也揭示了我最初的逻辑问题。我应该从我的帖子中删除原来的解决方案吗?查看更新。 – KingOfTheWood

+0

'list.SelectMany(x => x.datapoints.First())。Average(x => x)'也可能是一个改进。不知道它是否相同。只有删除最初的解决方案,如果它是错误的 –