2015-01-29 2 views
1

Как реализовать IComparer, который нуждается в аргументе (может быть, не имеет значения, но я использую его в запросе Linq)?Пользовательский Icomparer с аргументом

Я полагаю, он должен называться так:

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 
+1

Создать конструктор MyComparer, который принимает один аргумент? – rducom

ответ

11

Вы не можете добавить аргумент в метод 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

проблема i что это невозможно сделать точно так, как вы просите.

Причина в том, что вы пытаетесь изменить подпись метода Compare, что приведет к тому, что внешние библиотеки (такие как Linq!) Не смогут вызвать метод, поскольку аргументы, которые они передают, больше не являются необходимы аргументы. Таким образом, компилятор просто этого не допускает.

Однако есть это способ обойти это, для этого конкретного случая, в том, что, поскольку IComparer s используется в качестве объектов, вы можете создать класс, который реализует IComparer и принимает пользовательский объект в конструкторе, сохранив его поле и использование этого для сравнения. Таким образом, вы попали в

var comp = new CustomComparer(argument); 

ListOfObjectsToSort.OrderBy(x => x, comp); 
Смежные вопросы