簡體   English   中英

使用指定屬性按字母順序對對象的常規列表進行排序

[英]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...
}

我嘗試使用ICompareIComparable接口,但我只是沒有得到它。

如何編寫Sort方法?

您可以嘗試使用LINQ擴展方法OrderByOrderByDescendingThenByThenByDescending

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);
    }
}

假設PeopleList<Person> ,您可以像這樣在AddressBook類的Sort方法中使用它:

public void Sort(bool asc, string column)
{
    People.Sort(new PersonComparer(asc, column));
}

此代碼的好處是使用就地排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM