如何有效地复制List <t> .BinarySearch?</t>中的ArrayList.BinarySearch

时间:2013-02-20 01:18:03

标签: 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);
   }
}

1 个答案:

答案 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;
    }
}