我想使用 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/