C# h、 Substring(pathElementGroup.Key.Length+1)”因此它将生成一个IEnumerablet这似乎解决了强制转换问题,但如何提取每个id/path?Children=BuildTree(//从propertyPath创建
C# h、 Substring(pathElementGroup.Key.Length+1)”因此它将生成一个IEnumerablet这似乎解决了强制转换问题,但如何提取每个id/path?Children=BuildTree(//从propertyPath创建,c#,wpf,mvvm,treeview,C#,Wpf,Mvvm,Treeview,h、 Substring(pathElementGroup.Key.Length+1)”因此它将生成一个IEnumerablet这似乎解决了强制转换问题,但如何提取每个id/path?Children=BuildTree(//从propertyPath创建子级(从pathElementGroup中的propertyPathElement,其中propertyPathElement.path.Length>pathElementGroup.Key.Length+1选择new MessageElem
h、 Substring(pathElementGroup.Key.Length+1)”因此它将生成一个IEnumerablet这似乎解决了强制转换问题,但如何提取每个id/path?Children=BuildTree(//从propertyPath创建子级(从pathElementGroup中的propertyPathElement,其中propertyPathElement.path.Length>pathElementGroup.Key.Length+1选择new MessageElement()).ToList())谢谢你让我试试这个。我会使用IEnumerable,如果这能让事情变得更容易的话。当我开始这项工作时,我试着去做我认为更容易的事情。如果你能向我解释替换为thatLINQ的好处会很好,因为它是基于通用IEnumerable接口的语法糖,请检查这里的详细信息-在我的视图模型中,我正在做这件事测试代码后出现空引用异常。我更新了我的原始帖子。你能看一下吗?…我认为代码中存在问题。其想法是保留分配给每个路径的每个id。例如1,“NetworkControl.AlternateIndexText.Value”或2,“NetworkControl.AddressData.DestinationID”等。
public class MessageElement
{
private int id;
public string Name { get; set; }
public string path { get; set; }
public List<MessageElement> Children { get; set; }
public List<MessageElement> messageElements { get; set; }
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;
}
}
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.Add(new MessageElement(3, "VehicleSummary.VehicleIdentification.IdentificationID.Value"));
messageElements.Add(new MessageElement(3, "TitleSummary.JurisdictionTitlingKeyText.Value"));
messageElements.Add(new MessageElement(1, "VehicleSummary.VehicleIdentification.IdentificationID.Value"));
return messageElements;
public List<MessageElement> BuildTree(IEnumerable<MessageElement> messageElements)
{
return (
from element in messageElements // Ex:(1, "NetworkControl.AlternateIndexText.Value")
let elementId = element.id // get id from message element
let splitPath = element.path.Split('.') // get path from message element
group element by element.path.Split('.')[0] into pathElementGroup
select new MessageElement(ID, path)
{
ID = elementId, ?? // id of each path Ex: 1 => "NetworkControl.AlternateIndexText.Value"
Name = pathElementGroup.Key, //name of each tree node to be displayed on tree
Children = BuildTree( //create child from the propertyPath
(from propertyPathElement in pathElementGroup
where propertyPathElement.path.Length > pathElementGroup.Key.Length + 1
select new MessageElement())
.ToList<MessageElement>())
}
);
}
}
BuildTree( //create child from the propertyPath
(from propertyPathElement in pathElementGroup
where propertyPathElement.path.Length > pathElementGroup.Key.Length + 1
select propertyPathElement.path.Substring(pathElementGroup.Key.Length + 1)).ToList())
}
var result = BuildTree(0, GetRequestTreeNodes());
public List<MessageElement> BuildTree(int depth, List<MessageElement> messageElements)
{
if (messageElements == null)
{
return null;
}
return (
from element in BuildGrouping(depth, messageElements) // Ex:(1, "NetworkControl.AlternateIndexText.Value")
let elementId = element.Key // get id from message element
select new MessageElement()
{
ID = depth, // id of each path Ex: 1 => "NetworkControl.AlternateIndexText.Value"
Name = element.Key, //name of each tree node to be displayed on tree
Children = BuildTree(depth +1, //create child from the propertyPath
element.ToList<MessageElement>())
}
).ToList<MessageElement>();
}
public IEnumerable<IGrouping<string, MessageElement>> BuildGrouping(int depth, List<MessageElement> messageElements)
{
string key = string.Empty;
if (messageElements != null && messageElements.Count > 0)
{
string[] splits = messageElements[0].path.Split('.');
if (splits.Length > depth)
{
key = splits[depth];
}
}
if (string.IsNullOrEmpty(key))
{
return new List<IGrouping<string, MessageElement>>();
}
return from element in messageElements group element by element.path.Split('.')[depth];
}