如何实现需要参数的IComparer(可能不相关,但我在Linq查询中使用它)?
我想它应该像这样调用:
ListOfObjectsToSort.orderBy(x => x, myCustomComparer(argument));
这就是我在如何实现IComparer方面所发现的,但我无法弄清楚如何更改它以传递参数:
public class MyComparer : IComparer<object>
{
public int Compare(object x, object y)
{
// code will then return 1,-1 or 0
答案 0 :(得分:13)
您无法向Compare
方法添加参数,也不会违反接口合约。将属性添加到可在方法中使用的类:
public class MyComparer : IComparer<object>
{
public int MyArgument {get; set;}
public int Compare(object x, object y)
{
// code will then return 1,-1 or 0
// use MyArgument within the method
}
您可以在构造函数中设置它:
public MyComparer(int argument)
{
MyArgument = argument;
}
然后你的语法是:
var myCustomComparer = new MyComparer(argument);
ListOfObjectsToSort.orderBy(x => x, myCustomComparer);
或只是
ListOfObjectsToSort.orderBy(x => x, new MyComparer(argument));
答案 1 :(得分:2)
问题在于,这不能完全按照你的要求完成。
原因是你试图改变Compare
方法的签名,这会导致外部库(如Linq!)无法调用该方法,因为它们传递的参数是不再需要论据。因此,编译器根本不允许这样做。
但是,对于这种特殊情况,是的一种解决方法,因为IComparer
被用作对象,你可以创建一个实现IComparer
的类并在构造函数中获取自定义对象,将其保存到字段并将其用于比较计算。因此,你最终得到了
var comp = new CustomComparer(argument);
ListOfObjectsToSort.OrderBy(x => x, comp);