【问题标题】:Get closest value in an Array获取数组中最接近的值
【发布时间】:2016-12-22 07:36:01
【问题描述】:
int [] testArray = new int[3] { 5, 7, 8};

int check = 22;

var nearest = testArray.Min(x => Math.Abs(x - check));

Debug.Print(Convert.ToString(nearest));

我有上面的代码作为尝试获取数组中最接近支票号码的最接近的数字,在本例中为 22。

问题是,由于 Math.Abs​​,这总是返回一个正值,但如果我删除它,代码将完全失败。例如,如果支票号码是 10,我希望最接近返回 -2 而不是 2。这样我可以将最接近的值添加到支票号码以获得数组中的正确值。

我在搜索时发现了类似的东西,叫做 MoreLinq,它建议使用 array.MinBy 代替,但是这种方法会引发错误(说它不存在)...谢谢

【问题讨论】:

  • 你想得到数组中离你的号码最近的号码还是到这个号码的距离?标题建议您希望 22 结果导致 8,但是您的解释和代码似乎更像是期望 (-)14。
  • MoreLinq 是 Linq 的扩展。您可以从 nuget 包管理器获取它。查看morelinq.github.io
  • @wkl 的想法是得到 8,但是我试图通过首先获取距离然后将其添加到初始数字以获取数组中的一个来实现这一点。
  • @DavidFarrugia 谢谢你的解释。我应该更仔细地阅读......
  • @wkl 别担心 :) 谢谢你的帮助..

标签: c# arrays math int min


【解决方案1】:

我会建议以 min 为第一顺序并取第一个值。这是您最接近的值,您可以随心所欲地使用它。比如计算nearest-check

int[] testArray = new int[3] { 5, 7, 8 };

int check = 22;

var nearest = testArray.OrderBy(x => Math.Abs(x - check)).First();

Debug.Print(Convert.ToString(nearest-check));

【讨论】:

  • 感谢 tweeked 并完美运行。再次感谢。
  • 这很优雅:-)
【解决方案2】:

如果保证源数组是有序的,可以使用Array.BinarySearch。我保证它比您可能找到的任何 LINQ 解决方案都要快。

int[] arr = { 3, 5, 7 };
int idx = Array.BinarySearch(arr, 3);
int closest = idx < 0 ? arr[~idx] : arr[idx];

【讨论】:

    【解决方案3】:

    试试testArray.Aggregate((min, next) =&gt; Math.Abs(next - check) &gt; Math.Abs(min - check) ? min : next)。它必须比OrderBy() 更快。

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      相关资源
      最近更新 更多