按父项和子项列出的订单列表

cru*_*chy 7 .net c# linq

我有一个产品清单,必须由父母订购,然后是父母的所有孩子,然后是下一个父母,等等.

Product One
    Child One
    Child Two
Product Two
    Child One
Run Code Online (Sandbox Code Playgroud)

这些产品都在一个带有父ID字段的表中,子产品具有父ID,但父项可以具有空父项(表示该产品是顶级产品)

样本表

我在考虑以下内容:

var list = GetProductList();
var newList = new List<ProductDTO>();

var parents = from p in list
    where p.Parent == null
    select p.Id;


foreach (var parent in parents)
{
    var tempList = new List<ProductDTO>();
    tempList.Add(list.FirstOrDefault(x => x.Id == parent));
    tempList.AddRange(list.Where(x => x.Parent == parent).OrderBy(x => x.Id));
    newList.AddRange(tempList);
}
Run Code Online (Sandbox Code Playgroud)

关于我怎么做这个有点清洁的任何建议?

loo*_*ode 5

鉴于“Parent”是可为空的属性(假设这里的 int 可为空)。以下应该给你父子相关的有序列表:

 public class ProductDTO
 {
     public int Id { get; set; }
     public string Name { get; set; }
     public int? Parent { get; set; }
 }

 var products = new List<ProductDTO>();
 products.Add(new ProductDTO() { Id = 1, Name = "Product One" });
 products.Add(new ProductDTO() { Id = 2, Name = "Product Two" });
 products.Add(new ProductDTO() { Id = 3, Name = "Product Three" });
 products.Add(new ProductDTO() { Id = 4, Name = "Child One", Parent=1 });
 products.Add(new ProductDTO() { Id = 5, Name = "Child Two", Parent = 2 });
 products.Add(new ProductDTO() { Id = 6, Name = "Child One", Parent = 1 });

var ordered = products
                .Where(p => p.Parent == null)
                .OrderBy(p=> p.Id)
                .Select(p => products
                    .Where(c => c.Parent == p.Id)
                    .OrderBy(c => c.Id))
                .ToList();
Run Code Online (Sandbox Code Playgroud)

  • 以上只是一个例子。父级可以是数据中的任何内容。只要它是父母的有效 ID。 (2认同)

Lev*_*Lev 5

你可以尝试这样的事情。假设 parent 是可空的:

var sorted = list.OrderBy(x => x.parent ?? x.id).ThenBy(x=>x.id);
Run Code Online (Sandbox Code Playgroud)

如果它是一个字符串:

            var sorted = list.OrderBy(x =>
            {
                if (x.parent == "null")
                    return x.id;
                else
                    return Convert.ToInt32(x.parent);
            }).ThenBy(x => x.id);
Run Code Online (Sandbox Code Playgroud)