我仍然是 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。
uj5u.com熱心網友回復:
檢查串列中最大值和最小值之間的差異(在您的情況下為 2)。使用公差值。例如
double delta = 2;
// getting largest element
var maxNum = odds.Max();
// getting smallest element
var minNum = odds.Min();
var almostEqual = maxNum - minNum <= delta;
uj5u.com熱心網友回復:
您需要手動執行此操作,正如每次浮點數比較時所建議的那樣(因為浮點數學是不直觀的),這樣做非常簡單,如下所示:
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
現在,如果您想檢查 a 中的每個元素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");
(這利用了這樣一個事實,即 min 和 max 之間的所有其他元素也足夠接近以接近相等,如果 min 和 max 相同)
您可以查看Max 此處的實作以了解它們是如何執行的,但基本上它只是一個foreach回傳找到的最高值的回圈。
*第二個版本更快,因為它O(2N)和第一個版本一樣O(N^2),我添加了第一個版本來說明如何在不僅僅是數字的物件串列上做同樣的事情
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/313582.html
