关注@JonSkeet 的回答,我做了IList 的BinarySearch 扩展,类似于.NET sourcecode:
public static class IListBinarySearchHelper {
public static int BinarySearch<T>(this IList<T> source, int index, int count, T item, IComparer<T> comparer) {
if (index < 0) throw new Exception("Need non negative number of index.");
if (count < 0) throw new Exception("Need non negative number of count.");
if (source.Count - index < count) throw new Exception("Invalid offset length of count.");
Contract.Ensures(Contract.Result<int>() <= index + count);
Contract.EndContractBlock();
return Array.BinarySearch<T>(source.Cast<T>().ToArray(), index, count, item, comparer);
}
public static int BinarySearch<T>(this IList<T> source, T item) {
Contract.Ensures(Contract.Result<int>() <= source.Count);
return BinarySearch(source, 0, source.Count, item, null);
}
public static int BinarySearch<T>(this IList<T> source, T item, IComparer<T> comparer) {
Contract.Ensures(Contract.Result<int>() <= source.Count);
return BinarySearch(source, 0, source.Count, item, comparer);
}
}
所以现在我们可以这样做了:
var nums = new ObservableCollection<int>();
nums.Add(1);
nums.Add(3);
nums.Add(8);
var result = nums.BinarySearch(1); /// return 0
result = nums.BinarySearch(4); /// return -3
这对我来说很完美。
返回值与Array.BinarySearch相同,正数表示找到的索引,负数表示插入点的提示。
按名称重新排序我的收藏的最有效方法是什么
新项目是否出现在列表中的正确位置?
要回答这个问题,只需在与 BinarySearch 返回值相关的点插入值即可。