2016-12-18 8 views
1

이 구문에서 대리자를 사용하는 논리를 이해하지 못합니다. 나는C# 정렬 내에서이 대리자는 무엇입니까

Array.Sort (thing, delegate (Things c1, Things c2) 
      { 
       return c1.Item.CompareTo(c2.Item); 
      }); 
+1

익명 기능이라고합니다. – SLaks

+0

도움이 될 수 있습니다. http://stackoverflow.com/questions/2122012/c-sorting-with-anonymous-function – seems

답변

1

대리인은, 익명 함수로 알려진, 당신은 다음과 같이 완전히 분리 기능을 필요없이 비교 메커니즘을 선언 할 수 있습니다 ... 문자열을 정렬하는 방법을 찾고이 건너 온거야 :

private void button1_Click(object sender, EventArgs e) 
    { 
     Things t1 = new Things(); 
     t1.Item = "z"; 
     Things t2 = new Things(); 
     t2.Item = "a"; 

     Things[] things = new Things[]{ t1, t2}; 
     Array.Sort(things, CompareThings); 

     foreach(Things t in things) 
     { 
      Console.WriteLine(t.Item); 
     } 
    } 

    private int CompareThings(Things c1, Things c2) 
    { 
     return c1.Item.CompareTo(c2.Item); 
    } 

Here's an example on MSDN은 익명의 기능을 가진 하나의 버전과 위와 같이 선언 된 기능이있는 버전을 보여줍니다.

.Net은 하나의 "Things"인스턴스를 다른 인스턴스와 비교하는 방법을 모르기 때문에 부수적으로 c1.Itemc2.Item으로 비교해야합니다.

public class Things : IComparable<Things> 
{ 
    public string Item = ""; 

    int IComparable<Things>.CompareTo(Things other) 
    { 
     return this.Item.CompareTo(other.Item); 
    } 

} 

얹는 : 다음에 속하는 특정 클래스에 대한

private void button1_Click(object sender, EventArgs e) 
    { 
     Things t1 = new Things(); 
     t1.Item = "z"; 
     Things t2 = new Things(); 
     t2.Item = "a"; 

     Things[] things = new Things[]{ t1, t2}; 
     Array.Sort(things); // <-- the intenal implementation of CompareTo() we added to class Things will be used! 

     foreach(Things t in things) 
     { 
      Console.WriteLine(t.Item); 
     } 
    } 
1

당신이 IComparable 인터페이스를 구현하는 경우, 그러나, 다음 코드는 익명 또는 별도의 기능을 필요로하지 않는 청소기가된다 문자열 클래스 및 숫자 (int, float, decimal, ...)를 나타내는 클래스와 같이 IComparable (@Idle_Mind ans 참조) 인터페이스가 있으므로 (선택 사항)입니다. wer)가 이미 구현되었습니다.

당신은 당신이 특별한 행동을 구현 하려면이 대리자를 정의하거나 수있는 당신이에서 IComparable 구현하지 않는 비 편집 가능한 클래스 에 비교 메커니즘을 사용합니다.

당신은 일반적으로 문자열 정렬 한 고려 :

Array.Sort(sa, (x, y) => x.CompareTo(y) * -1); 

이유 : 당신이 다른 방향으로 문자열을 정렬이 고려

string s = "eabdfc"; //String to sort 
char[] sa = s.ToCharArray(); //Convert to array 
Array.Sort(sa); //Sort without any delegate 
Console.WriteLine(new string(sa)); // The new string sorted 

을, 당신은에 의해에 Array.sort 라인을 대체 할 수 ? compareTo와 반환해야하므로 :

  • -1 < X 원소 Y가
  • 0 소자 X = Y
  • 한 경우 소자 x> Y

그렇다면 어떤 클래스와 함께 Array.Sort를 사용하려면 다음 중 하나를 수행해야합니다. IComparable 인터페이스 (해당되는 경우 ser 정의 된 클래스), 또는 델리게이트를 정의 할 수 있습니다.

요약 : IComparable이 클래스에 대한 기본 동작을 제공하는 동안 동일한 클래스 또는 동일한 개체에 대해 서로 다른 위치에 다른 동작을 작성할 수 있으므로 위임은 유연성을 제공합니다.

영어를 이해할 수 있기를 바랍니다. 언제든지 저를 교정하십시오.