0

我正在开发 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"));

4

1 回答 1

0

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

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

select new MessageElement
                  { ... }

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

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

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

于 2013-06-08T01:48:01.653 回答