2009-05-21 2 views
2

Ich ziehe einen Datensatz in eine C# -Liste und sortiere sie. Es ist ein hierarchisches Menü:Wie sortiere ich eine C# -Liste von Daten, wo die Daten eine hierarchische Struktur (Menü) sind?

Beispielobjekt:

public class NavigationInfo 
{ 
    public Int32 Id { get; set; } 
    public Int32 ParentId { get; set; } 
    public String Text { get; set; } 
    public String Url { get; set; } 
    public Int32 Sort { get; set; } 
} 

Die ParentId bis Id ist rekursiv und Sortieren ist eine aufsteigende ganze Zahl innerhalb des ParentId. Wie erfolgt das mit einer Sammlung von NavigationInfo in List<NavigationInfo>?

Antwort

3

Sie können wie etwas tun:

var navigationInfos = new List<NavigationInfo>(); //fill this collection 

navigationInfos.sort((a,b) => a.Id.CompareTo(b.Id)); //sort by Id 
navigationInfos.sort((a,b) => a.ParentId.CompareTo(b.ParentId)); //sort by ParentId 

UPDATE: Sie können auch LINQ verwenden und eine OrderBy auf der Liste tun. Dies gibt eine neue Sammlung zurück, ist jedoch viel einfacher nach mehreren Kriterien aufsteigend oder absteigend zu sortieren.

var navigationInfos = new List<NavigationInfo>(); //fill this collection 
var listSortedById = navigationInfos 
          .OrderBy(n => n.Id).ToList(); 

var listSortedByParentId = navigationInfos 
           .OrderBy(n => n.ParentId).ToList(); 

var listSortedByIdThenByParentId = navigationInfos 
           .OrderBy(n => n.Id) 
           .ThenBy(p => p.ParentId) 
           .ToList(); 

var orderedByIdDescending = navigationInfos 
             .OrderByDescending(n => n.Id) 
             .ToList(); 
+3

Wenn Sie DOWNVOTE, bitte seien Sie reif und höflich genug, um einen Kommentar zu hinterlassen, wo ich falsch liege. –

+0

Ich stimme zu .... das macht mich auch verrückt ... – CSharpAtl

+0

Dieser Code funktioniert, wenn Sie genau zwei Ebenen in Ihrer Hierarchie haben, sonst wird der Code ungenau sortieren. –

1

Wenn die Daten von der DB kommt, können Sie ließ die DB die Ausgabe in sortierter Weise (erste Elternteil, gefolgt von Kind Id) senden.

Hinweis: Ich nehme an, DB hat die Ids in einer Reihenfolge, in der der Elternteil eine kleinere ID als ein Kind ist.

1

Wenn Ihre Hierarchie wird mehr sein als eine einfache Zwei-Ebenen-Anordnung, werden Sie eine Methode schreiben müssen (wahrscheinlich rekursiv), dass der Baum reisen kann den gesamten „Pfad“ Sammeln der einzelnen IDs des Artikels. Sobald Sie diesen Pfad haben, ist der Sortierschritt ziemlich einfach.

eine Eigenschaft NavigateInfo

public string ItemPath { get; set; } 

Dann ein Verfahren wie dieses Add verwenden Sie diese Eigenschaft festlegen.

public string GetPath(List<NavigationInfo> list, int itemId) 
{ 
    NavigationInfo item = list.SingleOrDefault(x => x.Id == itemId); 
    if (item == null) 
    { 
     return ""; 
    } 
    else 
    { 
     return GetPath(list, item.ParentId) + "\\" + itemId; 
    } 
}