【问题标题】:Remove items with values beyond average [closed]删除值超出平均值的项目[关闭]
【发布时间】:2014-09-12 15:12:17
【问题描述】:

我有一个整数列表,即:

 List<int> test = new List<int>() {
     5, 5, 4, 0, 1, 23456732, 4, 3, 2, 4, 3
 };

我想计算列表中整数的平均值,但不考虑任何异常值(如中间的值)。 List 对象中是否有我可以使用的方法?最好的方法是什么?

【问题讨论】:

  • 你如何定义abnormal
  • 您可能想要平均值,而不是平均值。
  • 是什么让 23456732 “异常”?
  • 基于什么你需要忽略23456732?
  • 也许你想计算平均值和标准差,然后只计算那些比原始平均值更接近标准差三倍的数据点的新平均值?当假设数据点遵循正态分布时,这是“异常”的常见定义。但这是你对“异常”的定义吗?你真的需要考虑你的需求,只有当你定义了它们,你才能实现它们。

标签: c# integer average


【解决方案1】:

使用 LINQ:

var average = test.Average();

如果你想排除一些值,那么你需要过滤它们:

// average of numbers less than 100
var average = test.Where(i => i < 100).Average();

您可以定义自己的函数来检查给定的数字是否正常:

var average = test.Where(i => IsNormal(i)).Average();
// method
bool IsNormal(int number)
{
    // your logic here
    return true;// or false
}

【讨论】:

  • test.Where(i =&gt; IsNormal(i)).Average(); 并将IsNormal 的定义交给问题的作者:)
  • @GrzegorzSławecki:哈哈
  • 好电话@GrzegorzSławecki,我会把它添加到我的答案中,剩下的留给 Bartosz。谢谢!
  • 我知道我的答案可能是错误的,这取决于abnormal 的定义,但我仍然不相信这个答案值得反对。
  • 既然这个答案已被接受为最佳答案,我想我毕竟是对的,但仍然存在downvote,没有解释。
【解决方案2】:

您可以先计算median,然后只使用与median(示例中为10)相差一个给定因子的值进行计算:

public double GetResult(List<int> values)
{
    int median = Median(values);
    return values.Where(x => Math.Abs(x - median) < 10 * median).Average();
}

public static int Median(IEnumerable<int> list)
{
    List<int> orderedList = list
      .OrderBy(numbers => numbers)
      .ToList();

    int listSize = orderedList.Count;
    int result;

    if (listSize % 2 == 0) // even
    {
        int midIndex = listSize / 2;
        result = ((orderedList.ElementAt(midIndex - 1) +
               orderedList.ElementAt(midIndex)) / 2);
    }
    else // odd
    {
        double element = (double)listSize / 2;
        element = Math.Round(element, MidpointRounding.AwayFromZero);

        result = orderedList.ElementAt((int)(element - 1));
    }

    return result;
}

取自此页面的中位数计算:http://www.remondo.net/calculate-mean-median-mode-averages-csharp/

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 1970-01-01
    • 2020-04-01
    • 2021-10-12
    • 2021-02-21
    • 2016-08-04
    • 2013-03-01
    • 2019-03-07
    • 2021-03-22
    相关资源
    最近更新 更多