객체의 선후관계를 정의하고 정렬하고자할 때 매번 작성되는 불필요한 코드작성을 피해야한다. 다음 코드는 전략패턴(Strategy)과 함께 사용한다.
public abstract class BasePersonCompare : IComparer<Person>
{
public abstract int Compare(Person left, Person right);
}
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;
}
}
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;
}
}
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}";
}
}
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));
}
}