C# 在泛型数组中寻找最近的值?

标签 c# algorithm search

同于:C# Finding Nearest Number in Array但不一定有数字

我正在考虑创建一个如下所示的扩展方法:

public static TSource ClosestTo<TSource>(this IEnumerable<TSource> source
    , TSource target
    , IComparer<TSource> comparer = null)

当然,我们可以添加一个从 TSourceint 的转换器,并复制符合 int 的算法。

但我想知道是否可以仅通过比较来实现同样的效果,而不必求助于 int 转换才能使用 Math.Abs​​

最佳答案

从根本上说,不——该签名没有提供足够的信息来确定“接近度”。

IComparer<T>只允许您比较两个值以查看一个值是否大于、小于或等于另一个值。没有“距离”的概念。

有了那个签名你可以返回:

  • 匹配 target 的值
  • 小于 target 的值但大于小于 target 的任何其他值
  • 大于 target 的值但小于大于 target 的任何其他值

这是假设 source不包含任何彼此相等的值。

因此,例如,给定输入 { 1, 6, 3, 7, 8, 10 } 和目标 4,您可以返回“3 和 6”——但您无法判断 3 更接近目标比 6 是。

请注意,在 IComparer<T> 中根本没有“距离”概念的情况下,值可能会像这样具有可比性或 IComparable<T> .我不知道有任何类似的界面确实有这个概念。例如,您可以按顺序对字符串进行排序,但“fox”和“wombat”之间的距离会是多少?您可能构建一些距离概念,但可能存在多个相互竞争的概念,而且我怀疑随着所涉及的字符串变得越来越长,您会遇到精度问题。

关于C# 在泛型数组中寻找最近的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50540578/

相关文章:

c# Double.MinValue 和 Double.MaxValue 之间的随机数

c# - 图像在 WPF 功能区控件中无法正确呈现

sql - 区分句子中的单词

c++ - 递归回溯打印长度为 N 的二进制数的所有组合而不使用循环

C++ 变量没有正确地从 vector 接收新值?

C# 方法返回未使用的 Disposable

c# - 序列化时忽略 XML 属性

python - 数组解释的循环旋转

数字搜索范围(在搜索中使用实数)

c# - 获取名称以特定字符串开头的所有控件