Создайте вложенную древовидную структуру из списка <KeyIdObject> - PullRequest
0 голосов
/ 31 мая 2019

Из моего предыдущего вопроса на форуме по ссылке, Переберите ввод json и создайте древовидную иерархию, основанную на "ключах" с учетом дочерних "ключей" .Я строю на этом вопросе и хочу создать Treeview из содержимого List<KeyId>.

Глубоко вложенный JSON отображается в дерево AC #, где у каждого узла есть два свойства - строковый ключ иlong T_id - а также набор дочерних элементов одного типа.

public partial class KeyIdObject
{
    public string key { get; set; }
    public long T_id { get; set; }
    public List<KeyIdObject> Children { get; set; }
}

Структура json имеет следующую структуру:

{
   "Soccer":{
      "T_id":0,
      "T_state":"valid",
      "Clubs":{
         "ClubA":{
            "T_id":"1",
            "T_state":"Champs"
         },
         "ClubB":{
            "T_id":"2",
            "T_state":"Runnerups"
         }
      },
      "Subs":{
         "SubA":{
            "T_id":"3",
            "T_state":"Unfit",
            //this is nested key
            "SubE":{
               "T_id":"3",
               "T_state":"Unfit"
            }
         }
      },
      "Subs_Used":{
         "SubK":{
            "T_id":"3",
            "T_state":"Unfit"
         }
      }
      //many more nested n-levels   
   }
}

Затем она может быть использована для генерацииСписок рекурсивного типа такой:

public partial class KeyIdObject
{
    public static List<KeyIdObject> ToIdObjects(JToken root)
    {
        return root.TopDescendantsWhere<JObject>(o => o["T_id"] != null)
            .Select(o => new KeyIdObject { key = ((JProperty)o.Parent).Name, T_id = (long)o["T_id"], Children = ToIdObjects(o) })
            .ToList();
    }
}

Содержимое List<KeyIdObject> выглядит примерно так ниже:

Output List<KeyIdObject>: 
[
  {
    "key": "Soccer",
    "T_id": 0,
    "Children": [
      {
        "key": "Clubs",
        "Children": [
          {
            "key": "ClubA",
            "T_id": 1
          },
          {
            "key": "ClubB",
            "T_id": 2
          }
        ]
      },
      {
        "key": "Subs",
        "Children": [
          {
            "key": "SubA",
            "T_id": 3,
            "Children": [
              {
                "key": "SubE",
                "T_id": 3
              }
            ]
          }
        ]
      },
      {
        "key": "Subs_Used",
        "Children": [
          {
            "key": "SubK",
            "T_id": 3
          }
        ]
      }
    ]
  }
]

Исходя из этой информации, я хочу иметь возможность анализировать каждый "ключ" иего дочерние элементы и создайте вид, подобный следующему, когда пользователь нажимает на соответствующую клавишу, будет раскрывающийся список с соответствующим содержимым.

>Soccer
  >Clubs
    ClubA
    ClubB
  >Subs
    SubA
  >Subs_Used
    SubK

Я подумал, что было бы хорошо создать две ObservableCollectionследующим образом.

  1. ObservableCollection<KeyIdObject> rootMenuItem; // для хранения только строки "Soccer" и ее "T_id"?
  2. ObservableCollection<KeyIdObject> subMenuItem; // добавить эту коллекцию как дочерний элемент кrootMenuItem в конце концов, после того, как сделано, populating

Когда я выполняю итерацию по результирующему выходному списку, я хочу использовать рекурсивную функцию, которая может добавить все «потомки» в иерархию, как показано в Выходных данных List<KeyIdObject>, чтобы получить что-то вродеэто ниже:

  >Clubs
    ClubA
    ClubB
  >Subs
    SubA
  >Subs_Used
    SubK

Я не уверен, как создать рекурсивную функцию, которая будет делать это.Любое руководство будет высоко ценится.Я не уверен, если это самый эффективный способ сделать это или есть лучший способ.

Я использую SfTreeView от https://help.syncfusion.com/xamarin/sftreeview/getting-started

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...