Сортировка списка, который содержится в подклассе - PullRequest
0 голосов
/ 29 октября 2011

Я пытаюсь отсортировать Закладки Chromes в алфавитном порядке сначала по папкам, а затем по URL

У меня есть эти классы (мистер Джейсон Гримм)

public class Bookmarks
    {
        public string Checksum { get; set; }
        public Root Roots { get; set; }
        public int Version { get; set; }
    }

    /// <summary>
    /// Contains 'folders' such as 'Bookmarks bar' and 'Other bookmarks'
    /// </summary>
    public class Root
    {
        public RootItem Bookmark_bar { get; set; }
        public RootItem Other { get; set; }

    }

    /// <summary>
    /// A folder of bookmarks
    /// </summary>
    public class RootItem
    {
        public List<Child> Children { get; set; }
        public string Date_added { get; set; }
        public string Date_modified { get; set; }
        public int Id { get; set; }
        public String Name { get; set; }
        public string Type { get; set; }
    }

    /// <summary>
    /// Contains information about a specific bookmark
    /// </summary>
    public class Child
    {
        public List<Child> Children { get; set; }
        public string date_added { get; set; }
        public int ID { get; set; }
        public string Name { get; set; }
        public String Type { get; set; }
        public Uri Url { get; set; }
    }

Я использую JavaScriptSerializer для десериализации и сериализации файла JSON. Файл десериализован ОК в структуру класса Закладки.

Теперь я хочу отсортировать два списка RootItem.Children и Child.Children, чтобы сначала были все папки, а затем URL-адреса в алфавитном порядке.

Как бы я это сделал?

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

Используйте List.Sort(Comparison<T> comparison) с пользовательским сравнением.

Это непроверенный код, так как у меня нет вашей десериализованной структуры, вам может понадобиться придать ей некоторую нулевую обработку, еслиChild.ChildItem может быть нулевым.
Я также предполагаю, что Child.Type сообщает, является ли закладка папкой или URL-адресом.Если нет, просто измените сравнение return child1.Type.CompareTo(child2.Type); на что-то, что сортирует по папке / url.

public void SortChildren(List<Child> childList)
{
    childList.Sort((child1, child2) =>
    {
        if (child1.Type == child2.Type)
        {
             // Sort by name
             return child1.Name.CompareTo(child2.Name);
        }
        else
        {
            // Sort the type. If this sorts in reverse, swap child1 and child2
            return child1.Type.CompareTo(child2.Type);
        }

    });
    // Sort children recursively
    foreach(var child in childList)
    {
        SortChildren(child.Children);
    }
}

Начните сортировку с

SortChildren(Root.Other.Children);

Редактировать
Более простой пример сортировки списка:

List<int> myInts = new List<int>{1,5,4,3,2};
myInts.Sort(); // default comparer
myInts.Sort((i1, i2) => { return i2.CompareTo(i1); }); // custom "reverse" comparison
0 голосов
/ 29 октября 2011

Если вы хотите, чтобы все они были в одном списке, вам нужно создать объект с нужными вам свойствами, например, например. MyListItem.

Я думаю, что ссылка System.Linq; и тогда вы можете получить геттер, который select Children.Select(c => new MyListItem( Name = c.Name, etc ).
Затем вы можете сделать то же самое для URL, но добавьте .OrderBy(c => c.Url);
Наконец, вы можете добавить последний список в первый, используя ToList() и Append.

...