2017-05-30 65 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)'也可能是一個改進。不知道它是否相同。只有刪除最初的解決方案,如果它是錯誤的 –