c# - 为什么 List.BinarySearch() 除了 IComparer<T> 之外没有采用 Comparison<T> 的重载?

标签 c# .net 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() 中发挥作用?

最佳答案

创建 IComparer<T> 非常容易来自Comparison<T> - 这是来自 MiscUtil 的(略有修改的)类(class)欢迎您使用:

/// <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);
    }
}

您还可以将扩展方法添加到 List<T>为您做这件事:

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

关于c# - 为什么 List.BinarySearch() 除了 IComparer<T> 之外没有采用 Comparison<T> 的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8405789/

相关文章:

C#成员变量继承

c# - Windows Phone 导航到同一页面的新实例

c# - 适用于 WPF 的 Microsoft .NET 图表控件

c# - 在多人游戏中处理多个按键

MySQL 与 SQL Server Express 性能比较

java - "Fastest"Java实现的哈希函数,比较部分文件

widget - Gadget 和 Widget 在技术(功能)上有何不同?

c# - LINQ to SQL Math.Round 问题

c# - SendKeys.SendWait 函数 - 向应用程序发送特殊 key

.net - 如何设置项目以使用 WcfSvcHost.exe 和 WcfTestClient.exe