BinarySearch 要求数据必须升序排序,否则结果不可靠;未找到时返回 ~index(如-4表示应插入索引3),需用 result >= 0 判断是否找到,插入位置为 ~result。
BinarySearch 在 C# 中不能直接用于任意数组或集合——它要求数据必须已升序排序,否则结果不可靠,甚至返回负数(表示插入位置的补码),这不是 bug,是设计使然。
为什么
返回负数?
这是最常被误解的点。当目标值不存在时,
不返回 -1,而是返回
(按位取反后的插入位置)。比如返回 -4,说明若插入该值,应放在索引 3 的位置(因为
)。
务必用
判断是否找到,而不是
若需获取插入位置,用
,但仅在
对
,要调用
,而非
或 LINQ
要求数组必须严格升序
哪怕只有一个逆序元素(如
),结果就可能错乱——算法不校验顺序,只按二分逻辑推进。
升序是硬性前提,不是“建议”。降序数组必须用自定义
,且整个查找过程都要保持一致
浮点数数组慎用默认比较:
会导致未定义行为;建议用
或显式处理 NaN
字符串默认区分大小写;如需忽略大小写,传入
泛型
和
的关键区别
二者 API 表面相似,但行为细节不同,混用容易出错。
C知道
CSDN推出的一款AI技术问答工具
下载
有多个重载,支持从指定索引/长度范围查找;
没有等效的“子范围”参数,只能对整个列表操作
的
方法返回值语义与数组完全一致,但若传入
且
是引用类型,会抛
自定义比较器必须实现
,不能只写一个
——后者得包装成
性能陷阱:别在每次查找前排序
如果数据动态变化、查找频次高,先
再
反而比线性扫描还慢。
时间复杂度 O(log n),但前提是数据已排序;排序本身是 O(n log n),单次查找不划算
高频读写场景,考虑
或
,它们自动维护顺序,
就是二分
若只是偶尔查、数据量小(Contains 或
更直观,也更不容易出错
真正要用好
,关键是把“数据有序”当成契约来维护,而不是当成一次性的预处理步骤。一旦顺序被破坏,所有后续查找结果都失去意义——这点比具体怎么写代码更难调试。
Array.BinarySearchArray.BinarySearch~index~3 == -4(result >= 0)(result != -1)~resultresult 时有效Listlist.BinarySearch(item)list.FindIndexIndexOfBinarySearch[1,3,2,4]IComparerdouble.NaNComparer.Default StringComparer.OrdinalIgnoreCaseList.BinarySearch Array.BinarySearchArray.BinarySearchList.BinarySearch ListBinarySearchnullTArgumentNullExceptionIComparerFuncComparer.Create(...) Sort()BinarySearch()BinarySearchSortedSetSortedListContainsFirstOrDefaultBinarySearch