带参数的自定义Icomparer

时间:2015-01-29 22:11:31

标签: c# linq icomparable icomparer

如何实现需要参数的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

2 个答案:

答案 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);