Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# h、 Substring(pathElementGroup.Key.Length+1)”因此它将生成一个IEnumerablet这似乎解决了强制转换问题,但如何提取每个id/path?Children=BuildTree(//从propertyPath创建_C#_Wpf_Mvvm_Treeview - Fatal编程技术网

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];
        }