6

我想使用List.BinarySearch()自定义项目类型。自定义类型不实现IComparable<T>;相反,我有几个Comparison<T>我调用的静态函数,因为在不同的点我想根据不同的标准对列表进行排序。另外,我认为它增加了清晰度,因为您的排序方式可以通过函数名称来描述。现在我想对列表进行二进制搜索。我想使用我的一个比较函数,却发现它List.BinarySearch()没有接受的重载Comparison<T>,只有IComparer<T>. 我尽量避免IComparer<T>,因为我觉得有一个单独的类只是为了比较对象很愚蠢。为什么没有除了 之外的List.BinarySearch()重载?有什么方法可以使用我现有的功能吗?Comparison<T>IComparer<T>Comparison<T>List.BinarySearch()

4

3 回答 3

11

IComparer<T>从 a创建一个非常容易- 这是一个来自MiscUtilComparison<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);
    }
}

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

public static int BinarySearch<T>(this List<T> list, Comparison<T> comparison)
{
    return list.BinarySearch(new ComparisonComparer(comparison));
}
于 2011-12-06T19:50:13.613 回答
1

Comparison为这样的一个创建包装器:

public class ComparisonWrapper<T> : IComparer<T>
{
    private Comparison<T> comparison;
    public ComparisonWrapper(Comparison<T> comparison)
    {
        this.comparison = comparison;
    }

    public int Compare(T x, T y)
    {
        return comparison(x, y);
    }
}
于 2011-12-06T19:50:42.010 回答
0

这是 Jon 的答案的扩展,它采用 lambda 表达式。

public static class ListExtensions
{
    public static int BinarySearch<T>(this List<T> list, T item, Func<T, T, int> compare)
    {
        return list.BinarySearch(item, new ComparisonComparer<T>(compare));
    }
}

public class ComparisonComparer<T> : IComparer<T>
{
    private readonly Comparison<T> comparison;

    public ComparisonComparer(Func<T, T, int> compare)
    {
        if (compare == null)
        {
            throw new ArgumentNullException("comparison");
        }
        comparison = new Comparison<T>(compare);
    }

    public int Compare(T x, T y)
    {
        return comparison(x, y);
    }
}
于 2013-01-19T10:09:48.773 回答