객체의 선후관계(Compare)

최용국·2020년 3월 14일
0

관용구

목록 보기
2/9

20-0314 객체의 선후관계(Compare)

객체의 선후관계를 정의하고 정렬하고자할 때 매번 작성되는 불필요한 코드작성을 피해야한다. 다음 코드는 전략패턴(Strategy)과 함께 사용한다.

class BasePersonCompare

public abstract class BasePersonCompare : IComparer<Person>
{
    public abstract int Compare(Person left, Person right);
}

class AgePersonCompare

public class AgePersonCompare : BasePersonCompare
{
    public override int Compare(Person left, Person right)
    {
        if (left.Age > right.Age)
            return 1;
        else if (left.Age < right.Age)
            return -1;
        else
            return 0;
    }
}

class NamePersonCompare

public class NamePersonCompare : BasePersonCompare
{
    public override int Compare(Person left, Person right)
    {
        if (left.Name[0] > right.Name[0])
            return 1;
        else if (left.Name[0] < right.Name[0])
            return -1;
        else 
            return 0;
    }
}

class Person

public class Person : IComparable<Person>
{
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public string Name { get; private set; }
    public int Age { get; private set; }

    public int CompareTo(Person other)
    {
        return CompareTo(other, new AgePersonCompare());
    }

    public int CompareTo(Person other, BasePersonCompare myComparable)
    {
        return myComparable.Compare(this, other);
    }

    public override string ToString()
    {
        return $"이름: {this.Name} 나이: {this.Age}";
    }
}

Program

class Program
{
    static void Main(string[] args)
    {
        List<Person> people = new List<Person>()
        {
            new Person("최용국", 28),
            new Person("이은혜", 31),
            new Person("안광필", 35),
            new Person("이정선", 29),
            new Person("도로시", 0),
        };

        Console.WriteLine("====================age sort========================");
        //asc
        people.Sort((left, right) => { return left.CompareTo(right); });
        Print(people);
        Console.WriteLine("======================desc=====================");
        //desc
        people.Sort((left, right) => { return right.CompareTo(left); });
        Print(people);

        Console.WriteLine("====================name sort========================");

        //asc
        people.Sort((left, right) => { return left.CompareTo(right, new NamePersonCompare()); });
        Print(people);
        Console.WriteLine("======================desc=====================");
        //desc
        people.Sort((left, right) => { return right.CompareTo(left, new NamePersonCompare()); });
        Print(people);

        Console.ReadLine();


    }

    public static void Print(List<Person> people)
    {
        people.ForEach(person => Console.WriteLine(person));
    }
}

결과

profile
코딩합시다.

0개의 댓글