对子类中包含的列表进行排序

时间:2011-10-29 15:02:52

标签: c# list sorting google-chrome bookmarks

我正在尝试按字母顺序对Chromes书签进行排序,首先是文件夹,然后是网址

我有这些课程(Jason Grimme先生)

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文件。 该文件被反序列化为OK,进入Bookmarks类结构。

现在我要对两个列表RootItem.Children和Child.Children进行排序,以便所有文件夹首先出现,然后按字母顺序排列所有文件夹。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

List.Sort(Comparison<T> comparison)与自定义比较结合使用。

这是未经测试的代码,因为我没有您的反序列化结构,如果Child.ChildItem可以为null,您可能需要使用一些空处理来增加它。 我还假设Child.Type告诉书签是文件夹还是URL。如果没有,只需将比较return child1.Type.CompareTo(child2.Type);更改为按文件夹/网址排序的内容。

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

答案 1 :(得分:0)

如果您希望它们都在同一个列表中,那么您必须使用所需的属性创建一个对象,例如MyListItem。

我认为引用System.Linq;然后你可以做一个select Children.Select(c => new MyListItem( Name = c.Name, etc )的吸气剂 然后,您可以对网址执行相同操作,但附加.OrderBy(c => c.Url);
最后,您可以使用ToList()Append将最后一个列表添加到第一个列表。