.net - 如何对 IList<T> 执行二分查找?

标签 .net generics list interface binary-search

简单问题 - 给出 IList<T>如何在不自己编写方法且不将数据复制到具有内置二分搜索支持的类型的情况下执行二分搜索。我目前的状态如下。

  • List<T>.BinarySearch()不是 IList<T> 的成员
  • 没有与 ArrayList.Adapter() 等效的项方法List<T>
  • IList<T>不继承自IList ,因此使用 ArrayList.Adapter()不可能的

我倾向于认为使用内置方法不可能做到这一点,但我无法相信 BCL/FCL 中缺少这样的基本方法。

如果不可能,谁能给 IList<T> 最短、最快、最智能、最漂亮的二分查找实现?

更新

我们都知道在使用二分搜索之前必须对列表进行排序,因此您可以假设它是这样的。但我假设(但没有验证)排序有同样的问题 - 你如何排序 IList<T>

结论

似乎没有内置的二分搜索 IList<T> 。可以使用First()OrderBy() LINQ 方法进行搜索和排序,但它可能会影响性能。自己实现它(作为扩展方法)似乎是您能做的最好的事情。

最佳答案

我怀疑 .NET 中是否存在这样的通用二分搜索方法,除了某些基类中存在的方法(但显然不在接口(interface)中),所以这是我的通用二分搜索方法。

public static Int32 BinarySearchIndexOf<T>(this IList<T> list, T value, IComparer<T> comparer = null)
{
    if (list == null)
        throw new ArgumentNullException(nameof(list));

    comparer = comparer ?? Comparer<T>.Default;

    Int32 lower = 0;
    Int32 upper = list.Count - 1;

    while (lower <= upper)
    {
        Int32 middle = lower + (upper - lower) / 2;
        Int32 comparisonResult = comparer.Compare(value, list[middle]);
        if (comparisonResult == 0)
            return middle;
        else if (comparisonResult < 0)
            upper = middle - 1;
        else
            lower = middle + 1;
    }

    return ~lower;
}

这当然假设相关列表已经根据比较器将使用的相同规则进行排序。

关于.net - 如何对 IList<T> 执行二分查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/967047/

相关文章:

css - Wordpress 在缩略图中显示列表

c# - 为什么 TextBlock 不绑定(bind)?

c# - 类型 [Type] 存在于 [Assembly1] 和 [netstandard 2.0 assembly] 中

c# - 无法调用 SystemParametersInfo

generics - 在 Rust 中,如何将 "add" `flatten"转换为 Option<Option<T>>?

c# - 如何从泛型类或方法的成员获取 T 的类型

python - Kml 创建错误

c# - 我无法使用 epplus 生成的 excel 将日期过滤为月、年、日期

c# - 无法从用法中推断出 GetInstance<T>()'。尝试明确指定类型参数

string - 如何将字符串列表拆分为 R 中的奇数和偶数元素