list sort

비교함수를 만들어 list를 sort 하는 방법에 대해서 알아보자.

1. Comparison<T>를 이용

원형 : public delegate int Comparison<T>(T x, T y)

반환값
조건
0보다 작음
x는 y보다 작습니다.
0
x는 y와 같습니다.
0보다 큼
x는 y보다 큽니다.

델리게이트 함수를 이용한다.

public class SortTest
{
    public int ByComparison(float x, float y)
    {
        return x.CompareTo(y);
    }    

    public void Run()
    {
        List<float> list = new List<float>(){ 30, 20, -10};
        list.Sort(ByComparison);

        Console.WriteLine("{0}, {1}, {2}", list[0], list[1], list[2]);      
    }
}

결과: -10, 20, 30

2. IComparer<T>를 이용

인터페이스 IComparer를 상속한 클래스를 이용한다.

using System;
using System.Collections.Generic;

public class Comparer : IComparer<float>
{
    public int Compare(float x, float y)
    {
        return x.CompareTo(y);
    }
}

List<float> list = new List<float>(){ 30, 20, -10};
list.Sort(new Comparer());

Console.WriteLine("{0}, {1}, {2}", list[0], list[1], list[2]); 

결과: -10, 20, 30

아래와 같이 리턴시 마이너스를 주면 역순으로  정렬된다.

using System;
using System.Collections.Generic;

public class Comparer : IComparer<float>
{
    public int Compare(float x, float y)
    {
        return -x.CompareTo(y);
        //마이너스이면 역순으로 정렬
        //결과: 30, 20, -10
    }
}

3. IComparer<T>로 범위 지정

리스트의 특정 범위를 지정하여 정렬할수 있다.

using System;
using System.Collections.Generic;

public class Comparer : IComparer<float>
{
    public int Compare(float x, float y)
    {
        return x.CompareTo(y);
    }
}

List<float> list = new List<float>(){ 30, 20, -10};
list.Sort(1, 2, new Comparer());  //1 인덱스에서 2개의 요소만 정렬

Console.WriteLine("{0}, {1}, {2}", list[0], list[1], list[2]);   

결과:  30, -10, 20

1번 인덱스에서 2개만 정렬하기 때문에 0번 인덱스는 정렬되지 않는다.
list.Sort(1, 2, new Comparer());

4. 람다 이용


using System;
using System.Collections.Generic;

public class Comparer : IComparer<float>
{
    public int Compare(float x, float y)
    {
        return x.CompareTo(y);
    }
}

List<float> list = new List<float>(){ 30, 20, -10};
list.Sort((float x, float y) =>
{
    return x.CompareTo(y);
});

결과:  30, -10, 20

참조)
http://bravochoi.tistory.com/134
http://pullthelever.tistory.com/479
https://www.dotnetperls.com/icomparable