【问题标题】:How to calculate the average of JArray value items如何计算 JArray 值项的平均值
【发布时间】:2019-07-02 02:51:06
【问题描述】:

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

我无法创建整个价值项的列表。 list values 只返回最后一个值。

【问题讨论】:

    标签: c# json


    【解决方案1】:

    问题在于您在哪里创建列表并计算平均值。想想你如何用计算器得到平均值:

    1. 您会得到一个数字列表。
    2. 您将每个数字添加到计算器中以获得总数。
    3. 除以总数除以加在一起的项目数。

    你的代码在做什么:

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

    我相信您可以理解您遇到问题的原因。请记住,计算机将完全按照您告诉他们的操作。而已。一点也不差。

    你需要像这样重写它:

    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&lt;decimal&gt;(),而不是之后将其转换为decimal。那么你只需要List&lt;decimal&gt;,而不是List&lt;string&gt;

    或者,也许更简单,使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 2017-02-06
      • 2012-06-19
      相关资源
      最近更新 更多