带参数的自定义 Icomparer

Custom Icomparer with argument

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

您不能向 Compare 方法添加参数,否则您违反了接口约定。在方法中可以使用的class中添加一个属性:

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

问题是这不能完全按照您的要求完成。

原因是您试图更改 Compare 方法的签名,这将导致外部库(如 Linq!)无法调用该方法,因为它们的参数pass 不再是所需的参数。因此,编译器根本不允许这样做。

但是, 有一种解决方法,对于这种特殊情况,由于 IComparer 被用作对象,您可以创建一个 class 它实现 IComparer 并在构造函数中获取一个自定义对象,将其保存到一个字段并使用它进行比较计算。因此,你最终得到

var comp = new CustomComparer(argument);

ListOfObjectsToSort.OrderBy(x => x, comp);