带参数的自定义 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);
如何实现需要参数的 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);