为什么List.BinarySearch()除了IComparer <T>之外还有比较<T>的重载?

Cra*_*g W 5 .net c# comparison binary-search icomparer

我想使用List.BinarySearch()自定义项类型.自定义类型未实现IComparable<T>; 相反,我有几个静态Comparison<T>函数,我打电话,因为在不同的点我想按不同的标准对列表进行排序.另外,我认为它增加了清晰度,因为您的排序方式可以通过函数名称来描述.现在我想在列表上进行二进制搜索.我想使用我的一个比较函数,List.BinarySearch()但却发现它没有Comparison<T>只接受的重载IComparer<T>.我试图避免,IComparer<T>因为对于我来说,只是为了比较对象而有一个单独的类似乎很愚蠢.为什么不List.BinarySearch()有采取过载Comparison<T>,除了IComparer<T>?有没有办法使用我现有的Comparison<T>功能List.BinarySearch()

Jon*_*eet 11

MiscUtil创建IComparer<T>一个Comparison<T>- 这是一个(略微修改过的)类非常容易,欢迎使用它:

/// <summary>
/// Utility to build an IComparer implementation from a Comparison delegate,
/// and a static method to do the reverse.
/// </summary>
public class ComparisonComparer<T> : IComparer<T>
{
    private readonly Comparison<T> comparison;

    public ComparisonComparer(Comparison<T> comparison)
    {
        if (comparison == null)
        {
            throw new ArgumentNullException("comparison");
        }
        this.comparison = comparison;
    }

    public int Compare(T x, T y)
    {
        return comparison(x, y);
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以添加扩展方法来List<T>为您执行此操作:

public static int BinarySearch<T>(this List<T> list, Comparison<T> comparison)
{
    return list.BinarySearch(new ComparisonComparer(comparison));
}
Run Code Online (Sandbox Code Playgroud)