如何计算JArray值项的平均值

时间:2019-07-02 02:51:06

标签: c# json

我有以下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;
        }
    }
}

我无法创建完整值项目的列表。列表值只返回最后一个值。

1 个答案:

答案 0 :(得分:0)

问题在于您要在哪里创建列表并计算平均值。考虑一下如何通过计算器获得平均值:

  1. 您会看到一个数字列表。
  2. 您将每个数字加到计算器中即可得出总数。
  3. 您将总数除以总计的数量。

您的代码在做什么:

  1. 它遍历数组中的每个数字。
  2. 列出1个号码。
  3. 将第2步中的每个数字加在一起(您只有一个数字)
  4. 除以4(出于某种原因)?
  5. 对于1.中的每个数字,从2.重复。

我确定您会明白为什么会遇到问题。请记住,计算机将完全按照您所说的去做。而已。没什么。

您需要像这样重写它:

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