我正在尝试将旧项目从使用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);
}
}
答案 0 :(得分:1)
要使用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;
}
}