C# 分层数据排序#

C# 分层数据排序#,c#,C#,我有一个小的等级制度。例如: 实体: public class MyClass { public int ID { get; set; } public string Name { get; set; } public int ParentID { get; set; } } 我的层次结构数据如下所示: Id = 1 Name = Item1 ParentId = NULL Id = 2 Name = Item2 ParentId = 1 Id = 3

我有一个小的等级制度。例如:

实体:

public class MyClass
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int ParentID { get; set; }
}
我的层次结构数据如下所示:

Id = 1  Name = Item1    ParentId = NULL
Id = 2  Name = Item2    ParentId = 1
Id = 3  Name = Item3    ParentId = 2
Id = 4  Name = Item4    ParentId = 2
Id = 5  Name = Item5    ParentId = 3
问题是我需要对它进行排序,子节点必须在其直接父节点之后。下面的示例必须如下所示

Id = 1  Name = Item1    ParentId = NULL
Id = 2  Name = Item2    ParentId = 1
Id = 3  Name = Item3    ParentId = 2
// the elements with parentID = 3
              Id = 5    Name = Item5    ParentId = 3
    //continue
    Id = 4  Name = Item4    ParentId = 2

任何adwices?

假设您有一个
对象的
名称
字段,然后在
父ID
字段对其排序,如下所示使用LINQ:

_list.OrderBy(L=>L.Name).ThenBy(L=>L.ParentId);

希望这会有所帮助。

假设您有一个
对象的
名称
字段上对其排序,然后在
父ID
字段上排序,如下所示使用LINQ:

_list.OrderBy(L=>L.Name).ThenBy(L=>L.ParentId);
希望这能有所帮助。

试试这个 我假设您首先要按parentid排序,然后在每个父级中要按id排序

myClassList.OrderBy(parent=>parent.ParentId).ThenBy(parent=>parent.Id);
试试这个 我假设您首先要按parentid排序,然后在每个父级中要按id排序

myClassList.OrderBy(parent=>parent.ParentId).ThenBy(parent=>parent.Id);

试试这个递归代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass.data = new List<MyClass>() {
                new MyClass() { ID = 1,  Name = "Item1",    ParentID = null},
                new MyClass() { ID = 2,  Name = "Item2",    ParentID = 1 },
                new MyClass() { ID = 3,  Name = "Item3",    ParentID = 2 },
                new MyClass() { ID = 4,  Name = "Item4",    ParentID = 2 },
                new MyClass() { ID = 5,  Name = "Item5",    ParentID = 3 }
            };

            MyClass myClass = new MyClass();
            myClass.GetData(null, 0);
            Console.ReadLine();
        }
    }
    public class MyClass
    {
        public static List<MyClass> data = null;
        public int ID { get; set; }
        public string Name { get; set; }
        public int? ParentID { get; set; }

        public void GetData(int? id, int level)
        {
            List<MyClass> children = data.Where(x => x.ParentID == id).ToList();

            foreach (MyClass child in children)
            {
                Console.WriteLine(" {0} ID : {1}, Name : {2}, Parent ID : {3}", new string(' ',4 * level),child.ID, child.Name, child.ParentID);
                GetData(child.ID, level + 1);
            }

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
MyClass.data=新列表(){
新建MyClass(){ID=1,Name=“Item1”,ParentID=null},
新建MyClass(){ID=2,Name=“Item2”,ParentID=1},
新建MyClass(){ID=3,Name=“Item3”,ParentID=2},
新建MyClass(){ID=4,Name=“Item4”,ParentID=2},
新建MyClass(){ID=5,Name=“Item5”,ParentID=3}
};
MyClass MyClass=新的MyClass();
myClass.GetData(null,0);
Console.ReadLine();
}
}
公共类MyClass
{
公共静态列表数据=null;
公共int ID{get;set;}
公共字符串名称{get;set;}
public int?ParentID{get;set;}
public void GetData(int?id,int级别)
{
List children=data.Where(x=>x.ParentID==id.ToList();
foreach(儿童中的MyClass儿童)
{
WriteLine(“{0}ID:{1},名称:{2},父ID:{3}”,新字符串(“”,4*级),child.ID,child.Name,child.ParentID);
GetData(child.ID,级别+1);
}
}
}
}

试试这个递归代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass.data = new List<MyClass>() {
                new MyClass() { ID = 1,  Name = "Item1",    ParentID = null},
                new MyClass() { ID = 2,  Name = "Item2",    ParentID = 1 },
                new MyClass() { ID = 3,  Name = "Item3",    ParentID = 2 },
                new MyClass() { ID = 4,  Name = "Item4",    ParentID = 2 },
                new MyClass() { ID = 5,  Name = "Item5",    ParentID = 3 }
            };

            MyClass myClass = new MyClass();
            myClass.GetData(null, 0);
            Console.ReadLine();
        }
    }
    public class MyClass
    {
        public static List<MyClass> data = null;
        public int ID { get; set; }
        public string Name { get; set; }
        public int? ParentID { get; set; }

        public void GetData(int? id, int level)
        {
            List<MyClass> children = data.Where(x => x.ParentID == id).ToList();

            foreach (MyClass child in children)
            {
                Console.WriteLine(" {0} ID : {1}, Name : {2}, Parent ID : {3}", new string(' ',4 * level),child.ID, child.Name, child.ParentID);
                GetData(child.ID, level + 1);
            }

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
MyClass.data=新列表(){
新建MyClass(){ID=1,Name=“Item1”,ParentID=null},
新建MyClass(){ID=2,Name=“Item2”,ParentID=1},
新建MyClass(){ID=3,Name=“Item3”,ParentID=2},
新建MyClass(){ID=4,Name=“Item4”,ParentID=2},
新建MyClass(){ID=5,Name=“Item5”,ParentID=3}
};
MyClass MyClass=新的MyClass();
myClass.GetData(null,0);
Console.ReadLine();
}
}
公共类MyClass
{
公共静态列表数据=null;
公共int ID{get;set;}
公共字符串名称{get;set;}
public int?ParentID{get;set;}
public void GetData(int?id,int级别)
{
List children=data.Where(x=>x.ParentID==id.ToList();
foreach(儿童中的MyClass儿童)
{
WriteLine(“{0}ID:{1},名称:{2},父ID:{3}”,新字符串(“”,4*级),child.ID,child.Name,child.ParentID);
GetData(child.ID,级别+1);
}
}
}
}

这里有一个方法。如您所见,我重写了
ToString
方法,并添加了几个案例

public class MyClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }

    public override string ToString()
    {
        return string.Format("{0}: {1} - {2}", Id, Name, ParentId);
    }
}

class Program
{

    static void Main(string[] args)
    {
        List<MyClass> list = new List<MyClass>();
        list.Add(new MyClass { Id = 1, Name = "Item1", ParentId = null });
        list.Add(new MyClass { Id = 2, Name = "Item2", ParentId = 1 });
        list.Add(new MyClass { Id = 3, Name = "Item3", ParentId = 2 });
        list.Add(new MyClass { Id = 4, Name = "Item4", ParentId = 2 });
        list.Add(new MyClass { Id = 5, Name = "Item5", ParentId = 3 });
        list.Add(new MyClass { Id = 6, Name = "Item6", ParentId = 1 });
        list.Add(new MyClass { Id = 7, Name = "Item7", ParentId = null });
        list.Add(new MyClass { Id = 8, Name = "Item8", ParentId = 2 });
        list.Add(new MyClass { Id = 9, Name = "Item9", ParentId = 6 });
        list.Add(new MyClass { Id = 10, Name = "Item10", ParentId = 7 });

        foreach(var item in list.Where(x => !x.ParentId.HasValue).OrderBy(x => x.Id))
            ProcessItem(item, list, 0);

        Console.ReadKey();

    }

    private static void ProcessItem(MyClass item, List<MyClass> list, int level)
    {
        Console.WriteLine("{0}{1}", new string(' ', level * 2), item.ToString());
        foreach (var subitem in list.Where(x => x.ParentId == item.Id).OrderBy(x => x.Id))
            ProcessItem(subitem, list, level  + 1);
    }
}
公共类MyClass
{
公共int Id{get;set;}
公共字符串名称{get;set;}
public int?ParentId{get;set;}
公共重写字符串ToString()
{
返回string.Format(“{0}:{1}-{2}”,Id,Name,ParentId);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
列表=新列表();
添加(新的MyClass{Id=1,Name=“Item1”,ParentId=null});
添加(新的MyClass{Id=2,Name=“Item2”,ParentId=1});
添加(新的MyClass{Id=3,Name=“Item3”,ParentId=2});
添加(新的MyClass{Id=4,Name=“Item4”,ParentId=2});
添加(新的MyClass{Id=5,Name=“Item5”,ParentId=3});
添加(新的MyClass{Id=6,Name=“Item6”,ParentId=1});
添加(新的MyClass{Id=7,Name=“Item7”,ParentId=null});
添加(新的MyClass{Id=8,Name=“Item8”,ParentId=2});
添加(新的MyClass{Id=9,Name=“Item9”,ParentId=6});
添加(新的MyClass{Id=10,Name=“Item10”,ParentId=7});
foreach(list.Where(x=>!x.ParentId.HasValue).OrderBy(x=>x.Id))中的变量项
ProcessItem(项,列表,0);
Console.ReadKey();
}
私有静态void ProcessItem(MyClass项、列表、int级别)
{
WriteLine({0}{1}),新字符串('',级别*2),item.ToString();
foreach(list.Where(x=>x.ParentId==item.Id).OrderBy(x=>x.Id))中的var子项
ProcessItem(子项、列表、级别+1);
}
}
你喜欢这个工作吗

如果需要实际的有序列表,请尝试以下操作:

foreach (var item in OrderList(list))
    Console.WriteLine(item.ToString());

(...)

private static List<MyClass> OrderList(List<MyClass> list)
{
    List<MyClass> orderedList = new List<MyClass>(list.Count());
    foreach (var item in list.Where(x => !x.ParentId.HasValue).OrderBy(x => x.Id))
        AddItem(item, list, orderedList);

    return orderedList;
}

private static void AddItem(MyClass item, List<MyClass> list, List<MyClass> orderedList)
{
    orderedList.Add(item);
    foreach (var subitem in list.Where(x => x.ParentId == item.Id).OrderBy(x => x.Id))
        AddItem(subitem, list, orderedList);
}
foreach(订单列表(列表)中的变量项)
Console.WriteLine(item.ToString());
(...)
私有静态列表OrderList(列表列表)
{
List orderedList=新列表(List.Count());
foreach(list.Where(x=>!x.ParentId.HasValue).OrderBy(x=>x.Id))中的变量项
附加项(项目、列表、订单列表);
返回订单列表;
}
私有静态void AddItem(MyClass项、列表列表列表、列表orderedList)
{
orderedList.Add(项目);
列表中的foreach(var)子项,其中(x=>x.Paren