【问题标题】:Custom Icomparer with argument带参数的自定义比较器
【发布时间】:2015-01-29 22:11:31
【问题描述】:

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

【问题讨论】:

  • 创建一个接受一个参数的 MyComparer 构造函数?

标签: c# linq icomparable icomparer


【解决方案1】:

您不能向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));

【讨论】:

    【解决方案2】:

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

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

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

    var comp = new CustomComparer(argument);
    
    ListOfObjectsToSort.OrderBy(x => x, comp);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2018-12-22
      相关资源
      最近更新 更多