我正在研究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”));
答案 0 :(得分:0)
您的问题“为什么ID仍为0?”的答案。是你永远不会在任何地方设置ID。怎么会是其他任何价值?
设置ID的最佳机会可能是您创建MessageElement
对象的位置。您正在BuildTree
方法的select语句中执行此操作。
select new MessageElement
{ ... }
您正在选择新的MessageElement
,但不使用构造函数传入ID,也不在初始化程序块中设置ID。您需要构建MessageElement
并使用以id
和path
作为参数的构造函数。
select new MessageElement(theId, thePath)
{ ... }
至于你获得ID的价值,我不确定。你让我的工作方式难以理解你的代码。如果您使用了一些有意义的变量名,代码将更容易理解。例如's'和'g'的含义是什么?有些人可能认为其含义是显而易见的,但使用有意义的名称并不会花费任何费用。此外,您的整个BuildTree方法是一个返回语句,但它包含两个分布在16行的LINQ理解查询。我怀疑如果你付出一些努力来重写这段代码以采取更小的逻辑步骤,问题可能会变得更加明显,更不用说使调试更容易了。 C#是一种非常富有表现力的语言,但最好使用这种表达方式来提高清晰度,而不是实现尽可能少的语句。