Вы можете использовать реализацию IComparer<T>
:
public class PersonComparer : IComparer<Person>
{
private readonly bool _sortAscending;
private readonly string _columnToSortOn;
public PersonComparer(bool sortAscending, string columnToSortOn)
{
_sortAscending = sortAscending;
_columnToSortOn = columnToSortOn;
}
public int Compare(Person x, Person y)
{
if(x == null && y == null) return 0;
if(x == null) return ApplySortDirection(-1);
if(y == null) return ApplySortDirection(1);
switch(_columnToSortOn)
{
case "LastName":
return ApplySortDirection(SortByName(x, y));
break;
case "PostCode":
return ApplySortDirection(SortByPostCode(x, y));
break;
default:
throw new ArgumentOutOfRangeException(
string.Format("Can't sort on column {0}",
_columnToSortOn));
}
}
private int SortByPostCode(Person x, Person y)
{
return x.PostCode.CompareTo(y.PostCode);
}
private int SortByName(Person x, Person y)
{
var lastNameResult = x.LastName.CompareTo(y.LastName);
if(lastNameResult != 0)
return lastNameResult;
return x.FirstName.CompareTo(y.FirstName);
}
private int ApplySortDirection(int result)
{
return _sortAscending ? result : (result * -1);
}
}
Вы можете использовать ее в методе Sort
вашего AddressBook
класса, например, при условии, что People
является List<Person>
:
public void Sort(bool asc, string column)
{
People.Sort(new PersonComparer(asc, column));
}
Преимущество этого кода заключается в использовании сортировки по месту.