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