2015-01-29 15 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의 객체로 사용되기 때문에

그러나 당신이에 저장, IComparer를 구현하고 생성자에서 사용자 정의 오브젝트를 클래스를 만들 수 있다는 점에서,이 특정한 경우에,이 주위에 방법이 입니다 필드를 사용하여 비교 계산에 사용합니다. 따라서

var comp = new CustomComparer(argument); 

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