2012-09-15 30 views
2

我有一個關於在C#中排序的問題。如何排序列表<Person>有時候等於條目?

讓我們假設有List<Person> personList有50個項目。
每個Personstring forename, surname

現在我想排序這個人的名單。
首先列表按Forename排序。
爲此我會用這樣的:
personList.Sort((p1, p2)=>string.Compare(p1.Forename, p2.Forname, true));

在此之後,我想通過自己的Surname具有相同Forname所有條目進行排序。

我該怎麼做?

編輯: @Russ Cam:下面是一個示例列表。

未分類:

David Johnson 
William Black 
David Smith 
Matthew Edwards 
Jayden Anderson 
Andrew Connor 
Adam Johnson 
Daniel Armstrong 
Steve Anderson 
Daniel Black 

排序:

Adam Johnson 
Andrew Connor 
Daniel Armstrong 
Daniel Black 
David Johnson 
David Smith 
Jayden Anderson 
Matthew Edwards 
Steve Anderson 
William Black 

回答

2

這工作完全

personList.Sort((p1, p2)=>string.Compare(p1.Forename+p1.Surname, p2.Forname+ p2.Surname, true)); 
+0

也適合我:)謝謝Séddik! – TorbenJ

8

你可以使用LINQ的OrderBy方法來做到這一點

var sortedPersonList = personList.OrderBy(p => p.Forename).ThenBy(p => p.Surname); 

編輯:

下面是一個完整的控制檯應用程序,以驗證它返回結果的順序,你希望

static void Main() 
{ 
    var personList = new List<Person>{ 
     new Person("David Johnson"), 
     new Person("William Black"), 
     new Person("David Smith"), 
     new Person("Matthew Edwards"), 
     new Person("Jayden Anderson"), 
     new Person("Andrew Connor"), 
     new Person("Adam Johnson"), 
     new Person("Daniel Armstrong"), 
     new Person("Steve Anderson"), 
     new Person("Daniel Black") 
    }; 

    var sortedPersonList = personList.OrderBy(p => p.Forename).ThenBy(p => p.Surname); 

    foreach (var person in sortedPersonList) 
    { 
     Console.WriteLine(person); 
    } 

    Console.Read(); 
} 

public class Person 
{ 
    public Person(string name) 
    { 
     var names = name.Split(' '); 
     Forename = names[0]; 
     Surname = names[1]; 
    } 

    public string Forename { get; set; } 
    public string Surname { get; set; } 

public override string ToString() 
{ 
    return Forename + " " + Surname; 
} 
} 

其寫出

Adam Johnson 
Andrew Connor 
Daniel Armstrong 
Daniel Black 
David Johnson 
David Smith 
Jayden Anderson 
Matthew Edwards 
Steve Anderson 
William Black 
+0

不幸的是,它不適合我。列表中有25個人具有相同的'Forename'和不同的'Surname',但在這種情況下,您的解決方案根本不能排序。不知道爲什麼,但謝謝你回答:) – TorbenJ

+0

@TorbenJonas你可以添加你想排序的問題和預期的排序順序的列表或人員? –

2

你可以讓Person實施System.IComparable<Person>

public class Person : IComparable<Person> 
{ 
    public string Forename { get; set; } 
    public string Surname { get; set; } 

    public int CompareTo(Person other) 
    { 
     int comp = Forename.CompareTo(other.Forename); 
     if (comp != 0) { 
      return comp; 
     } 
     return Surname.CompareTo(other.Surname); 
    } 
} 

根據這個定義,你可以直接排序與

personList.Sort(); 

您還可以傳遞一個IComparer<T>Sort方法。這允許您爲人員定義不同的分類(按名稱,按年齡,薪水等)。

public class ComparePersonsByName : IComparer<Peron> 
{ 
    public static readonly ComparePersonsByName Instance = 
     new ComparePersonsByName(); 

    private ComparePersonsByName() 
    { 
    } 

    public int Compare(Person x, Person y) 
    { 
     int comp = x.Forename.CompareTo(y.Forename); 
     if (comp != 0) { 
      return comp; 
     } 
     return x.Surname.CompareTo(y.Surname); 
    } 
} 

現在你可以用

personList.Sort(ComparePersonsByName.Instance); 

注意排序:我使用Singleton模式的變體在這裏。


您可能必須添加用於測試在真實的生活場景null引用。

+0

感謝您的廣泛答覆。即使我沒有采取你的解決方案,我肯定會嘗試一段時間。 :) – TorbenJ