Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带子项的订购列表_C#_Linq - Fatal编程技术网

C# 带子项的订购列表

C# 带子项的订购列表,c#,linq,C#,Linq,道歉,如果这是问其他地方,但我已经搜索了一个合适的答案,但我找到的大多数信息只允许单子项目 我正在尝试编写一个程序,以树状视图样式的界面显示信息。我面临的问题是,我正在从后端数据库读取以下类: public class InputClass { public int id { get; set; } public string text { get; set; } public string icon { get; set; } public int? paren

道歉,如果这是问其他地方,但我已经搜索了一个合适的答案,但我找到的大多数信息只允许单子项目

我正在尝试编写一个程序,以树状视图样式的界面显示信息。我面临的问题是,我正在从后端数据库读取以下类:

public class InputClass
{
    public int id { get; set; }
    public string text { get; set; }
    public string icon { get; set; }
    public int? parentId { get; set; }

}
我试图将其转换为以下类型的列表:

public class OutputClass
{
    public int id { get; set; }
    public string text { get; set; }
    public string icon { get; set; }
    public List<OutputClass> children { get; set; }
}

子列表中的元素数量不应仅限于一个。有没有关于如何正确分类的想法

以下代码应打印您需要的内容:

static void Main(string[] args)
{
    var inputList = new List<InputClass>();
    inputList.Add(new InputClass() { id = 1, text = "Item #1" });
    inputList.Add(new InputClass() { id = 2, text = "Item #2" });
    inputList.Add(new InputClass() { id = 3, text = "Item #3" });
    inputList.Add(new InputClass() { id = 4, text = "SubItem #1", parentId = 1 });
    inputList.Add(new InputClass() { id = 5, text = "SubItem #2", parentId = 1 });
    inputList.Add(new InputClass() { id = 6, text = "SubItem #3", parentId = 2 });

    var outputList = inputList
        .Where(i => !i.parentId.HasValue) // Just get the parents
        .Select(i => new OutputClass()
    {
        id = i.id,
        icon = i.icon,
        text = i.text,
        children = inputList
        .Where(x => x.parentId == i.id)
        .Select(x => new OutputClass()
        {
            id = x.id,
            icon = x.icon,
            text = x.text,
        }).ToList()
    }).ToList();


    foreach (var output in outputList)
    {
       Console.WriteLine(output.text);
       output.children.ForEach(c => Console.WriteLine($"\t {c.text}"));
    }

    Console.ReadLine();       
}

以下代码应打印您需要的内容:

static void Main(string[] args)
{
    var inputList = new List<InputClass>();
    inputList.Add(new InputClass() { id = 1, text = "Item #1" });
    inputList.Add(new InputClass() { id = 2, text = "Item #2" });
    inputList.Add(new InputClass() { id = 3, text = "Item #3" });
    inputList.Add(new InputClass() { id = 4, text = "SubItem #1", parentId = 1 });
    inputList.Add(new InputClass() { id = 5, text = "SubItem #2", parentId = 1 });
    inputList.Add(new InputClass() { id = 6, text = "SubItem #3", parentId = 2 });

    var outputList = inputList
        .Where(i => !i.parentId.HasValue) // Just get the parents
        .Select(i => new OutputClass()
    {
        id = i.id,
        icon = i.icon,
        text = i.text,
        children = inputList
        .Where(x => x.parentId == i.id)
        .Select(x => new OutputClass()
        {
            id = x.id,
            icon = x.icon,
            text = x.text,
        }).ToList()
    }).ToList();


    foreach (var output in outputList)
    {
       Console.WriteLine(output.text);
       output.children.ForEach(c => Console.WriteLine($"\t {c.text}"));
    }

    Console.ReadLine();       
}
对于您的输入,这将产生以下结果:

1 Item #1
  4 SubItem #1
  5 SubItem #2
2 Item #2
  6 SubItem #3
3 Item #3

作为一个示例,下面的输入列表使用与上面相同的转换代码生成以下输出:

var inputList = new List<InputClass>()
{
    new InputClass() { id = 1, text = "Item 1" },
    new InputClass() { id = 2, text = "Item 2" },
    new InputClass() { id = 3, text = "Item 3" },
    new InputClass() { id = 4, text = "SubItem 1.1", parentId = 1 },
    new InputClass() { id = 5, text = "SubItem 1.2", parentId = 1 },
    new InputClass() { id = 6, text = "SubItem 2.1", parentId = 2 },
    new InputClass() { id = 7, text = "SubItem 2.2", parentId = 2 },
    new InputClass() { id = 8, text = "SubItem 1.2.1", parentId = 5 },
    new InputClass() { id = 9, text = "SubItem 1.2.2", parentId = 5 },
    new InputClass() { id = 10, text = "SubItem 1.2.1.1", parentId = 8 },
    new InputClass() { id = 11, text = "SubItem 2.1.1", parentId = 6 },
    new InputClass() { id = 12, text = "SubItem 2.1.1.1", parentId = 11 },
    new InputClass() { id = 13, text = "SubItem 2.1.1.1.1", parentId = 12 },
    new InputClass() { id = 14, text = "SubItem 2.1.1.1.2", parentId = 12 }
};
对于您的输入,这将产生以下结果:

1 Item #1
  4 SubItem #1
  5 SubItem #2
2 Item #2
  6 SubItem #3
3 Item #3

作为一个示例,下面的输入列表使用与上面相同的转换代码生成以下输出:

var inputList = new List<InputClass>()
{
    new InputClass() { id = 1, text = "Item 1" },
    new InputClass() { id = 2, text = "Item 2" },
    new InputClass() { id = 3, text = "Item 3" },
    new InputClass() { id = 4, text = "SubItem 1.1", parentId = 1 },
    new InputClass() { id = 5, text = "SubItem 1.2", parentId = 1 },
    new InputClass() { id = 6, text = "SubItem 2.1", parentId = 2 },
    new InputClass() { id = 7, text = "SubItem 2.2", parentId = 2 },
    new InputClass() { id = 8, text = "SubItem 1.2.1", parentId = 5 },
    new InputClass() { id = 9, text = "SubItem 1.2.2", parentId = 5 },
    new InputClass() { id = 10, text = "SubItem 1.2.1.1", parentId = 8 },
    new InputClass() { id = 11, text = "SubItem 2.1.1", parentId = 6 },
    new InputClass() { id = 12, text = "SubItem 2.1.1.1", parentId = 11 },
    new InputClass() { id = 13, text = "SubItem 2.1.1.1.1", parentId = 12 },
    new InputClass() { id = 14, text = "SubItem 2.1.1.1.2", parentId = 12 }
};

此解决方案为O(n²)且仅支持两级层次结构。此解决方案为O(n²)且仅支持两级层次结构。回答和解释非常好。回答和解释非常好。
1 Item #1
  4 SubItem #1
  5 SubItem #2
2 Item #2
  6 SubItem #3
3 Item #3
var inputList = new List<InputClass>()
{
    new InputClass() { id = 1, text = "Item 1" },
    new InputClass() { id = 2, text = "Item 2" },
    new InputClass() { id = 3, text = "Item 3" },
    new InputClass() { id = 4, text = "SubItem 1.1", parentId = 1 },
    new InputClass() { id = 5, text = "SubItem 1.2", parentId = 1 },
    new InputClass() { id = 6, text = "SubItem 2.1", parentId = 2 },
    new InputClass() { id = 7, text = "SubItem 2.2", parentId = 2 },
    new InputClass() { id = 8, text = "SubItem 1.2.1", parentId = 5 },
    new InputClass() { id = 9, text = "SubItem 1.2.2", parentId = 5 },
    new InputClass() { id = 10, text = "SubItem 1.2.1.1", parentId = 8 },
    new InputClass() { id = 11, text = "SubItem 2.1.1", parentId = 6 },
    new InputClass() { id = 12, text = "SubItem 2.1.1.1", parentId = 11 },
    new InputClass() { id = 13, text = "SubItem 2.1.1.1.1", parentId = 12 },
    new InputClass() { id = 14, text = "SubItem 2.1.1.1.2", parentId = 12 }
};
1 Item 1
  4 SubItem 1.1
  5 SubItem 1.2
    8 SubItem 1.2.1
      10 SubItem 1.2.1.1
    9 SubItem 1.2.2
2 Item 2
  6 SubItem 2.1
    11 SubItem 2.1.1
      12 SubItem 2.1.1.1
        13 SubItem 2.1.1.1.1
        14 SubItem 2.1.1.1.2
  7 SubItem 2.2
3 Item 3