基本上,我有一个文件,我需要阅读\打开并在控制台排序。
该文件可以包含“用户”希望拥有的行数,并且看起来像这样
1,元件,
2,要素1,1
3,元素2,2
4,element23,1
等等...
第一部分是父ID,中间是它的名称,第三部分是ChildID
如果ChildID等于ParentID,我需要在它下面写它,所以看起来应该是这样
1,元件,
2,element1,1
3,element2,2
4,element23,1
我首先尝试记住临时变量中的每个部分,然后稍后进行比较,但由于这不起作用,我创建了一个由我使用的元素组成的列表.Split函数
通过2 for循环,我得到它来排序它,但问题来自我在列表中稍后得到一个元素需要放在开头的某个地方。它在正确的元素下排序,但顺序不正确。
public class information
{
public string Parent;
public string Name;
public string Child;
public Information
public Information (string ParentID, string NameID, string ChildID)
{
Parent = ParentID;
Name = NameID;
Child = ChildID;
}
}
这是我检查两个ID的条件并写出结果的部分。
for (int i = 0; i < list.Count; i++)
{
if (list[i].Child == "")
{
Console.WriteLine(list[i].Parent + " " + list[i].Name + " " + list[i].Child);
}
for (int k = 0; k < list.Count; k++)
{
if (list[i].Parent == list[k].Child)
{
Console.WriteLine("\t" + list[k].Parent + "," + list[k].Name + "," + list[k].Child);
}
}
}
所以,问题是,当我写出这样一行时,它不会放在正确的部分,我也不知道如何执行“\ t”以便它继续,这取决于写入的元素数量在它之前。
我相信应该使用递归方法,但此时我不知道该怎么做。
发布于 2019-06-13 14:12:42
信息类现在还包含子项列表:
class Information
{
public string Id { get; set; }
public string Name { get; set; }
public string ParentId { get; set; }
public List<Information> Children = new List<Information>();
}
样本数据:
var data = new List<string>
{
"2,element1,1",
"1,element,",
"3,element2,2",
"4,element23,1"
};
构建数据的逻辑:
//Create a dictionary of all items (for performance)
var dict = data
.Select(s => s.Split(','))
.Select(s => new Information
{
Id = s[0],
Name = s[1],
ParentId = s[2]
})
.ToDictionary(s => s.Id);
//Link the items by adding each item to the children list
foreach (var v in dict.Values)
{
if (!string.IsNullOrWhiteSpace(v.ParentId))
{
dict[v.ParentId].Children.Add(v);
}
}
创建一个调用自身以递归打印的方法:
void PrintRecursive(Information i, int tabCount)
{
//Print the item
Console.WriteLine($"{new string('\t', tabCount)}{i.Id},{i.Name},{i.ParentId}");
foreach (var child in i.Children.OrderBy(o => o.Id))
{
//Call the same method with increased tab
PrintRecursive(child, tabCount + 1);
}
}
最后,为最高级别的所有父项调用print方法:
//Print recursively
foreach(var item in dict.Values.Where(o => string.IsNullOrWhiteSpace(o.ParentId)))
{
PrintRecursive(item, 0);
}
https://stackoverflow.com/questions/-100007011
复制相似问题