如何将此文本文件内容转换为可以绑定到TreeView的递归对象集合?也就是说,我希望得到一个由3个对象组成的集合,第一个称为拥有三个子对象集合的国家:法国,德国,意大利等等……
答:感谢所有帮助过这一点的人,这是我的代码,它成功地将此文本大纲解析为XAML树:http://tanguay.info/web/index.php?pg=codeExamples&id=358
- countries
- -france
- --paris
- --bordeaux
- -germany
- -italy
- subjects
- -math
- --algebra
- --calculus
- -science
- --chemistry
- --biology
- other
- -this
- -that
下面的代码是我得到的,但它没有正确处理多个父母的孩子.
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace TestRecursive2342
- {
- class Program
- {
- static void Main(string[] args)
- {
- List<OutlineObject> outlineObjects = new List<OutlineObject>();
- //convert file contents to object collection
- List<string> lines = Helpers.GetFileAsLines();
- Stack<OutlineObject> stack = new Stack<OutlineObject>();
- foreach (var line in lines)
- {
- OutlineObject oo = new OutlineObject(line);
- if (stack.Count > 0)
- {
- OutlineObject topObject = stack.Peek();
- if (topObject.Indent < oo.Indent)
- {
- topObject.OutlineObjects.Add(oo);
- stack.Push(oo);
- }
- else
- {
- stack.Pop();
- stack.Push(oo);
- }
- }
- else
- {
- stack.Push(oo);
- }
- if(oo.Indent == 0)
- outlineObjects.Add(oo);
- }
- outlineObjects.ForEach(oo => Console.WriteLine(oo.Line));
- Console.ReadLine();
- }
- }
- public class OutlineObject
- {
- public List<OutlineObject> OutlineObjects { get; set; }
- public string Line { get; set; }
- public int Indent { get; set; }
- public OutlineObject(string rawLine)
- {
- OutlineObjects = new List<OutlineObject>();
- Indent = rawLine.CountPrecedingDashes();
- Line = rawLine.Trim(new char[] { '-',' ','\t' });
- }
- }
- public static class Helpers
- {
- public static List<string> GetFileAsLines()
- {
- return new List<string> {
- "countries","-france","--paris","--bordeaux","-germany","-italy","subjects","-math","--algebra","--calculus","-science","--chemistry","--biology","other","-this","-that"};
- }
- public static int CountPrecedingDashes(this string line)
- {
- int tabs = 0;
- StringBuilder sb = new StringBuilder();
- foreach (var c in line)
- {
- if (c == '-')
- tabs++;
- else
- break;
- }
- return tabs;
- }
- }
- }
解决方法
- public class Item
- {
- public string Name;
- public Item Parent;
- }
- List<Item> Collection = new List<Item>();
- public void Main()
- {
- var DataSource = data.InnerText;
- StreamReader Reader = new StreamReader(MapPath("_test2.txt"));
- int LastLevel = 0;
- while (Reader.EndOfStream == false) {
- var line = Reader.ReadLine();
- var Level = line.Where((System.Object c) => c == "-").Count;
- Item LastItem = default(Item);
- if (Collection.Count != 0) {
- LastItem = Collection.Last();
- }
- if (Level == 0) {
- Collection.Add(new Item { Name = line });
- LastLevel = 0;
- }
- else if (Level - LastLevel == 1) {
- Collection.Add(new Item { Name = line,Parent = LastItem });
- LastLevel += 1;
- }
- else if (Level == LastLevel) {
- Collection.Add(new Item { Name = line,Parent = LastItem.Parent });
- }
- else if (Level < LastLevel) {
- var LevelDiff = LastLevel - Level;
- Item Parent = LastItem;
- for (i = 0; i <= LevelDiff; i++) {
- Parent = Parent.Parent;
- }
- LastLevel = Level;
- Collection.Add(new Item { Name = line,Parent = Parent });
- }
- }
- Reader.Close();
- }
这应该可以解决问题.我在你的文本文件上测试了它.可能存在一些错误.测试它并告诉它是否有效.
编辑:实际上经过进一步测试后发现这不能按预期工作.您需要添加更多逻辑才能使其正常工作.我把它留给你.
编辑:经过测试代码后,我来到一个更好的版本.我仍然无法保证它在任何情况下都能正常工作.