【问题标题】:Tree: Parse string and build tree树:解析字符串并构建树
【发布时间】:2013-06-08 01:38:30
【问题描述】:

我正在开发 WPF 项目以在树视图中显示路径列表。我有属性路径 (例如:NetworkControl.AlternateIndexText.Value")路径有 id。

构造函数:

public MessageElement()
{
    Children = new List<MessageElement>();
    messageElements = new List<MessageElement>();
}

public MessageElement(int id, string name,   List<MessageElement> children)
{
    this.ID = id;
    this.Name = name;
    this.Children = children;
}

public MessageElement(int id, string path)
{
    this.ID = id;
    this.path = path;
}

这里我展示了我是如何进行解析的。

我正在从传递给 BuildTree 方法的 IEnumerable propertyPath 构建子项。

public List<MessageElement> BuildTree(IEnumerable<string> propertyPath)
{
    return (
            from path in propertyPath     // Ex: NetworkControl.AlternateIndexText.Value"
            let splitPath = path.Split('.')
            group path by path.Split('.')[0] into pathElementGroup

            select new MessageElement(ID, path)
            {
              // ID = Id,
              Name = pathElementGroup.Key,             //name of each tree node
              Children = BuildTree(                  //create child from the propertyPath
                from propertyPathElement in pathElementGroup
                where propertyPathElement.Length > pathElementGroup.Key.Length + 1
                select propertyPathElement.Substring(pathElementGroup.Key.Length + 1))
            }).ToList();

    }               

填充数据:

public List<MessageElement> GetRequestTreeNodes()
{
    messageElements.Add(new MessageElement(1, "NetworkControl.AlternateIndexText.Value"));
    messageElements.Add(new MessageElement(2, "NetworkControl.AddressData.DestinationID"));
    messageElements.Add(new MessageElement(2, "NetworkControl.AddressData.MessageOriginatorID.Value"));
}

这里我正在准备一个列表,我将从 messageElements 列表传递给 BuildTree 方法。

String[]  propertyPath = messageElements.Select(I => Convert.ToString(I.path)).ToArray();            
// int[] idList = messageElements.Select(I => (I.id)).ToArray();
List<MessageElement> nodeList = BuildTree(propertyPath);
return nodeList;

如何在用于构建树节点的 propertyPath 列表和 Id 之间创建关联。 例如 MessageElement(1, "NetworkControl.AlternateIndexText.Value"));

【问题讨论】:

    标签: c# wpf tree


    【解决方案1】:

    您的问题“为什么 ID 仍然为 0?”的答案是你永远不会在任何地方设置 ID。其他价值如何?

    设置 ID 的最佳机会可能是创建 MessageElement 对象的位置。您在 BuildTree 方法的 select 语句中执行此操作。

    select new MessageElement
                      { ... }
    

    您正在选择一个新的MessageElement,但没有使用构造函数传入 ID,也没有在初始化程序块中设置 ID。您需要构造 MessageElement 并使用以 idpath 作为参数的构造函数。

    select new MessageElement(theId, thePath)
                      { ... }
    

    至于您从哪里获得 ID 的值,我不确定。你让我努力理解你的代码。如果你使用一些有意义的变量名,代码会更容易理解。例如,“s”和“g”是什么意思?有些人可能会争辩说含义是显而易见的,但是使用有意义的名称不会花费您任何费用。此外,您的整个 BuildTree 方法是一个单独的 return 语句,但它包含两个独立的 LINQ 理解查询,分布在 16 行中。我怀疑如果你花一些精力重写这段代码以采取更小的逻辑步骤,问题可能会变得更加明显,更不用说让调试更容易了。 C# 是一种表达能力很强的语言,但最好使用这种表达能力来提高清晰度,而不是尽量减少语句数量。

    【讨论】:

    • 我有一个构造函数,它采用 (int id, string name, List children) 但我找不到在 BuildTree 方法中传递 ID 的简单方法。
    • 问题只是你从来没有在任何地方设置 ID 的值。
    • 感谢您富有洞察力的反馈我是 C# 新手。 S的含义是我传入的字符串路径的变量名,g是位置0的字符串组。是的,这里我的问题是我如何获取ID。
    • 我根据您的建议进行了更改,使我的代码更易于理解
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多