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

标签 c# generics arraylist binary-search

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

相关文章:

c# - 检索特定模式内的值

java - MapStruct 是否可以自动检测包含泛型类型作为源和目标的集合的映射?

c# - 动态 Lambda 表达式调用

c# - 泛型的反射子类

Java:如何让扫描仪仅匹配第一次出现的情况,如果之前已匹配过则跳过

java - 排序整数列表。与开头相同的元素

c# - 更快的替代 Convert.ToDouble(string)

c# - 当用户向其中输入数据时,TextBox.Text 为 null

java - 对从 csv 文件导入的数组列表进行小计

c# - 存储我的程序使用的一组常量的最佳方法是什么?