比较 C# .NET 中列表中的元素是否几乎相等

Compare if elements are almost equal in a list in C# .NET

我在 C# 和 .NET 方面还很初级,只需要做这个简单的测试。

var odds = new System.Collections.Generic.List<double>();

// here is a code which adds the values in the list

foreach(var odd in odds)
{
   System.Console.WriteLine(odd);
}

输出是这样的:

13.098252624859418
14.098252624859349
13.098252624859577
13.098252624853423
14.098252624859398

所以我想比较列表中的所有值,如果它们 几乎 相等。这意味着即使列表中的数字(例如 13 和 14)之间有一点差异仍然可以接受,所以我希望这个差异最大为 2.

检查列表中最大值和最小值之间的差异(在您的情况下为 2)。使用公差值。例如

double delta = 2;

// getting largest element
var maxNum = odds.Max();

// getting smallest element
var minNum = odds.Min();

var almostEqual = maxNum - minNum <= delta;

您需要手动执行此操作,正如每次浮点数比较 (because floating point math is unintuitive) 所建议的那样,这样做非常简单,如下所示:

var a = 13.098252624859418;
var b = 14.098252624859398;
// define your acceptable range, i.e 1.0 means number 1.0 larger and smaller are equal to one another
var delta = 1.0;

var areNearlyEqual = Math.Abs(a - b) <= delta; // true

现在如果你想检查 List 中的每个元素是否几乎等于所有其他元素,有一个简单且更“复杂”的解决方案,我将从简单的解决方案开始:

不要实际使用这个实现,这是为了说明如何检查列表中所有项目的相等性,而不仅仅是数字)

var allAreNearlyEqual = true; // Let's start of assuming all are equal

foreach (var x in odds)
{
    if (!allAreNearlyEqual)
        break;

    foreach (var y in odds)
    {
        if (!Math.Abs(x - y) <= delta)
            allAreNearlyEqual = false;
    }
}

Console.WriteLine(allAreNearlyEqual);

如您所见,我们需要遍历列表中的每个元素 (x) 并将其与列表中的每个其他元素 (y) 进行比较,有一个更易于阅读(也更快*)这个版本:

var max = odds.Max();
var min = odds.Min();

if (Math.Abs(max - min) <= delta)
    Console.WriteLine("All items are nearly equal");
else
    Console.WriteLine("Not all items are nearly equal");

(这利用了最小值和最大值之间的所有其他元素也足够接近几乎相等的事实,如果最小值和最大值是)

您可以查看 Max here 的实现,看看他们是如何做到的,但基本上它只是一个 foreach 循环,其中 returns 找到了最高值.


*第二个版本更快,因为它是 O(2N) 而第一个版本是 O(N^2),我添加第一个版本是为了说明如何对对象列表执行相同的操作这不仅仅是数字