gpt4 book ai didi

c# - 如何在 List.BinarySearch 中有效地复制 ArrayList.BinarySearch?

转载 作者:行者123 更新时间:2023-11-30 17:55:34 26 4
gpt4 key购买 nike

我正在尝试将一个旧项目从使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com