[英]Alphabetically sort a generic list of objects using a specified property
我正在寫一個通訊錄程序。 我將每個人的詳細信息存儲在List<Person>
。 我需要能夠按姓氏(如果有聯系使用名字)或郵政編碼對列表進行排序。
到目前為止,我有這個:
public class Person
{
public string LastName { get; set; }
public string FirstName { get; set; }
public string PostCode { get; set; }
// etc..
}
public class AddressBook
{
public List<Person> People { get; set; }
// asc: ascending or descending
// column: the property to use when sorting
// (in my case either LastName or Postcode)
public void Sort(bool asc, string column)
{
// What should I put here?
}
// etc...
}
我嘗試使用ICompare
和IComparable
接口,但我只是沒有得到它。
如何編寫Sort
方法?
您可以嘗試使用LINQ擴展方法OrderBy
, OrderByDescending
, ThenBy
和ThenByDescending
:
using System.Linq;
// ...
public void Sort(bool asc, string column)
{
switch (column)
{
case "LastName":
People = People.OrderBy(x => x.LastName).ThenBy(x => x.FirstName).ToList();
break;
case "PostCode":
People = People.OrderBy(x => x.PostCode).ToList();
break;
default:
// error handling
}
if (!asc)
{
People.Reverse();
}
}
您還可以查看Dynamic LINQ,它將簡化此代碼。
假設:
List<Person> personList;
然后與Linq:
IEnumerable<Person> orderedByLastName = personList.OrderBy(p => p.LastName)
您可以使用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);
}
}
假設People
是List<Person>
,您可以像這樣在AddressBook
類的Sort
方法中使用它:
public void Sort(bool asc, string column)
{
People.Sort(new PersonComparer(asc, column));
}
此代碼的好處是使用就地排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.