树:解析字符串和构建树

时间:2013-06-08 01:38:31

标签: c# wpf tree

我正在研究WPF项目,以在树视图中显示路径列表。我有propertyPaths (例如: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”));

1 个答案:

答案 0 :(得分:0)

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

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

select new MessageElement
                  { ... }

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

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

至于你获得ID的价值,我不确定。你让我的工作方式难以理解你的代码。如果您使用了一些有意义的变量名,代码将更容易理解。例如's'和'g'的含义是什么?有些人可能认为其含义是显而易见的,但使用有意义的名称并不会花费任何费用。此外,您的整个BuildTree方法是一个返回语句,但它包含两个分布在16行的LINQ理解查询。我怀疑如果你付出一些努力来重写这段代码以采取更小的逻辑步骤,问题可能会变得更加明显,更不用说使调试更容易了。 C#是一种非常富有表现力的语言,但最好使用这种表达方式来提高清晰度,而不是实现尽可能少的语句。