Как отсортировать список данных C #, где данные представляют собой иерархическое дерево (меню)? - PullRequest
2 голосов
/ 21 мая 2009

Я перетаскиваю набор данных в список c # и сортирую его. Это иерархическое меню:

образец объекта:

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

ParentId рекурсивен для Id, а Sort - это целое число в ParentId. Как это сделать, используя коллекцию NavigationInfo в List<NavigationInfo>?

Ответы [ 3 ]

3 голосов
/ 21 мая 2009

Вы можете сделать что-то вроде:

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

ОБНОВЛЕНИЕ: Вы также можете использовать LINQ и сделать OrderBy в списке. Это возвращает новую коллекцию, но ее намного проще заказать по нескольким критериям, по возрастанию или по убыванию.

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();
1 голос
/ 21 мая 2009

Если ваша иерархия будет представлять собой нечто большее, чем простое двухуровневое соглашение, вам нужно написать метод (возможно, рекурсивный), который может перемещаться вверх по дереву, собирая весь «путь» идентификаторов каждого элемента. Если у вас есть этот путь, шаг сортировки довольно прост.

Добавить свойство в NavigateInfo

public string ItemPath { get; set; }

Затем используйте такой метод, чтобы установить это свойство.

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;
    }
}
1 голос
/ 21 мая 2009

Если данные поступают из БД, вы можете разрешить БД отправлять выходные данные в отсортированном виде (сначала родитель, а затем дочерний идентификатор).

Примечание. Я предполагаю, что у БД есть идентификаторы в том порядке, в котором родительский идентификатор будет иметь меньший идентификатор, чем дочерний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...