我有一个产品列表,必须按父排序,然后按父的所有子排序,然后按下一个父排序,等等。
Product One
Child One
Child Two
Product Two
Child One
字符串
这些产品都在一个表中,具有父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);
}
型
有什么建议让我做得更干净一点吗?
8条答案
按热度按时间uoifb46i1#
你可以尝试类似的东西。假设parent是一个nullable:
字符串
如果是字符串:
型
dgsult0t2#
给定“Parent”是可空属性(这里假设可空的int)。下面应该会给你父子相关的有序列表:
字符串
6gpjuf903#
你可以这样做:
字符串
bq9c1y664#
我不知道它是否更干净,但如果你想要一个独特的linq指令,你可以试试这个:
字符串
oyxsuwqo5#
您应该为Product One和Product Two添加一个ParentId,这样会更容易解决。如果Parent One为1,Parent Two为2,则只执行此操作
字符串
db2dz4w86#
可以这样使用linq:
字符串
uubf1zoe7#
这是非常简单和复杂的方式,在'res'变量中,你会看到这种情况-parent 1> child.1.1 > child.1.2 > parent 2> child.2.1 > child.2.2 > child.2.3 > parent 3:
字符串
e5njpo688#
我也有同样的问题,但我用另一种方法解决了它,没有父级限制,使用递归原则。
通过编辑由@loopedcode编写的示例,有一些用于说明目的的Product类的编辑。
字符串
让我们编写一个递归函数,从给定的产品列表中构建一个有序列表
型
假设客户端代码给予我们一个完全无序的列表,只需调用根项的递归函数就可以构建有序列表
型
下面是输出结果的打印,解决方案可以尝试here
型