作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将一个旧项目从使用 ArrayList 集合升级到 List。除了转换 ArrayList.BinarySearch 之外,一切都非常顺利。虽然 List 有相应的方法,但 ArrayList.BinarySearch 有一个重载,它接受 arbitrary object。而 List.BinarySearch 需要 object of type T .下面的例子。
如何用 List 有效地替换 ArrayList 的功能?还是我必须自己动手?
class Pod {
public DateTime Start { get; set; }
}
class TimeRange: IComparer {
TimeSpan StartsAt { get; set; }
ITimeRangeComparer TimeComparer { get; set; }
public int Compare(object x, object y) {
// there is more to it, but basically compares time ranges
return comparer.Compare((TimeRange) x, (TimeRange) y);
}
}
class Manager {
void DoStuff() {
ArrayList alPods = GetPodsAL();
List<Pod> lstPods = GetPodsLST();
int stopIndex;
TimeRange startPoint = GetStartPoint();
TimeRange stopPoint = GetStopPoint();
// ArrayList works fine
stopIndex = alPods.BinarySearch(stopPoint, startPoint.TimeComparer);
// Fails because the method demands that `stopPoint` be of type Pod
stopIndex = lstPods.BinarySearch(stopPoint, startPoint.TimeComparer);
}
}
最佳答案
使用与 ArrayList.BinarySearch
相同的方法使用,转换你的 List<T>
到数组并调用 Array.BinarySearch(Array, object)
.不幸的是,您需要转换/复制到新数组。
List<SomeType> list;
SomeType value;
// ...
Array.BinarySearch(list.ToArray(), value)
不过,作为一个List<T>
,我确实质疑你的方法是强类型的,它只会包含类型 T
.如果您出于某种原因不确定该类型是否属于列表中的类型,请事先检查或制作扩展方法来为您完成。
public static class ListExtensionMethods
{
public static int BinarySearch<T>(this List<T> list, object value)
{
if (value is T)
return list.BinarySearch((T)value);
return -1;
}
}
关于c# - 如何在 List<T>.BinarySearch 中有效地复制 ArrayList.BinarySearch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14970681/
我是一名优秀的程序员,十分优秀!