在双打列表中找到异常

时间:2014-03-04 08:50:38

标签: c# .net linq

我有一个方法可以返回一个我无法信任的数字列表,因为有时我会得到一个不准确的数字。举个例子:

var nums = new List<double> {675,596,125278,490,545,567,470};

125278值显然是一个异常现象,有人可以帮助设计一种方法,根据其他数据摆脱列表中完全超出范围的所有数字吗?

目前我正在订购列表,然后获得中位数,但有时这已失败。没有数字应该超过36000左右。

一个想法是返回最低值?但理想情况下,我想返回列表中不是“异常”的最后一个数字,例如从上面的列表中应该返回470.

2 个答案:

答案 0 :(得分:1)

如果不是异常意味着低于36000,那么试试这个:

var notanomally = nums.Where(x=>x<36000); // lower than 36k
var lastnotanomally = notanomally.Last();

答案 1 :(得分:0)

这不是一种非常有效的方法,但你可以尝试这样的方法。

var nums = new List<double> { 675, 596, 125278, 490, 545, 567, 470 };
var removing = new List<double>();
var temp = new List<double>();
double EPSILON = 5000;

foreach (var num in nums)
{
    var average = nums.Average();
    temp = nums.Where(n => n != num).ToList();
    var average1 = temp.Average();
    if (Math.Abs(average1 - average) > EPSILON)
    {
        removing.Add(num);
    }
}

nums.RemoveAll(n=>removing.Contains(n));

此方法暂时删除元素并观察平均值的变化。平均值的显着变化意味着当前值远远大于其他值。