Wat*_* v2 13 c# collections list binary-search
我正在看List,我看到一个带有一些重载的BinarySearch方法,我不禁想知道在List中有这样的方法是否有意义?
除非列表已排序,否则为什么我要进行二进制搜索?如果列表没有排序,调用该方法只会浪费CPU时间.在List上使用该方法有什么意义?
Eri*_*ert 23
我注意到除了其他正确答案之外,二进制搜索难以正确编写.有很多极端情况和一些棘手的整数运算.由于二进制搜索显然是一种常见的操作上排序的列表中,BCL团队通过正确地写入二进制搜索算法做了世界一个服务一次,而不是鼓励客户都写自己的二进制搜索算法; 这些客户编写的大量算法都是错误的.
LBu*_*kin 18
排序和搜索是列表上的两个非常常见的操作.通过不在常规列表上提供二进制搜索来限制开发人员的选项是不友好的.
库设计需要妥协 - .NET设计人员选择在两个阵列上提供二进制搜索功能和C#中的列表,因为他们可能觉得(就像我这样)这些是有用的和常见的操作,选择使用它们的程序员理解他们的先决条件(在命令列表之前),在调用它们之前.
List<T>
使用其中一个Sort()
重载对它进行排序很容易.如果您觉得需要一个gaurantees排序的不变量,您可以随时使用SortedList<TKey,TValue>
或SortedSet<T>
替代.
其他人指出,这BinarySearch
对排序非常有用List<T>
.但是,它并不真正属于List<T>
,因为任何具有C++ STL经验的人都会立即认出来.
随着最近的C#语言开发,定义排序列表(例如ISortedList<T> : IList<T>
)和定义BinarySearch
(等)的概念作为该接口的扩展方法更有意义.这是一种更清洁,更正交的设计.
我已经开始将其作为Nito.Linq库的一部分.我预计第一个稳定版本会在几个月内发布.