同于:C# Finding Nearest Number in Array但不一定有数字
我正在考虑创建一个如下所示的扩展方法:
public static TSource ClosestTo<TSource>(this IEnumerable<TSource> source
, TSource target
, IComparer<TSource> comparer = null)
当然,我们可以添加一个从 TSource
到 int
的转换器,并复制符合 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/