3

我正在尝试将旧项目从使用 ArrayList 集合升级到 List。一切都很顺利,除了转换 ArrayList.BinarySearch。虽然 List 具有相应的方法,但 ArrayList.BinarySearch 具有接受任意对象的重载,而 List.BinarySearch 需要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);
   }
}
4

1 回答 1

1

要使用相同的方法ArrayList.BinarySearch,请将您的转换List<T>为数组并调用Array.BinarySearch(Array, object). 不幸的是,您需要转换/复制到新数组。

List<SomeType> list;
SomeType value;
// ...
Array.BinarySearch(list.ToArray(), value)

不过,我确实质疑您的方法,因为 aList<T>是强类型的,它只会包含 type 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;
    }
}
于 2013-03-09T08:18:49.253 回答