我有以下JArray对象:
entry: [
{
"name": "reading1",
"value": 9.194
},
{
"name": "reading2",
"value": 9.527
},
{
"name": "reading3",
"value": 10.194
},
{
"name": "reading4",
"value": 10.944
}
]
我想返回整个值并计算它们的平均值。
我试图遍历JArray并返回整个值项,如下所示:9.194 9.527、10.194、10.944。但是我无法从值项目创建列表来计算它们的平均值。
foreach (JObject item in entry.Children<JObject>())
{
foreach (JProperty prop in item.Properties())
{
if (prop.Name.Equals("value"))
{
List<string> values = new List<string>();
values.Add((string)prop.Value); //just add one value
for (int i = 0; i < values.Count; i++)
{
sum += decimal.Parse(values[i]);
}
average = sum / 4;
}
}
}
我无法创建完整值项目的列表。列表值只返回最后一个值。
答案 0 :(得分:0)
问题在于您要在哪里创建列表并计算平均值。考虑一下如何通过计算器获得平均值:
您的代码在做什么:
我确定您会明白为什么会遇到问题。请记住,计算机将完全按照您所说的去做。而已。没什么。
您需要像这样重写它:
List<string> values = new List<string>(); // build list outside of the loop so that we collect all of the values
foreach (JObject item in entry.Children<JObject>())
{
foreach (JProperty prop in item.Properties())
{
if (prop.Name.Equals("value"))
{
values.Add((string)prop.Value);
}
}
}
for (int i = 0; i < values.Count; i++)
{
sum += decimal.Parse(values[i]); // calculate the total
}
average = sum / values.Count; // calculate the average
值得注意的是,您可以简单地执行prop.Value.Value<decimal>()
,而不是事后将其转换为decimal
。然后,您只需要一个List<decimal>
,而不是一个List<string>
。
或者,也许更简单地使用LINQ:
var average = entry.Children<JObject>()
.Where(c => c.ContainsKey("value")) // only consider children that contain "value" to avoid errors
.Select(c => c["value"].Value<decimal>()) // select the decimal value of "value"
.DefaultIfEmpty() // don't throw an error for an empty list
.Average(); // calculate the average