Как создать полный универсальный TreeView как структура данных

Я хочу создать абсолютно универсальный treeview как структура. некоторая вещь как это:

public class TreeView<T, K, L>
{
    public T source;
    public K parent;
    public List<L> children;
}

как Вы видите в этом источнике класса, родителе и также детях, у всех есть различный универсальный тип данных. также я хочу, чтобы мой структурный вид имел неограниченное количество уровней (не всего 3). этот путь, когда я хочу работать со своими узлами в коде, все они будут со строгим контролем типов. не только возражает, что я должен преобразовать их в их исходный тип.

действительно ли возможно создать этот вид структуры в c#, treeview, который все его узлы со строгим контролем типов?

спасибо

7
задан Nima Rikhtegar 2 June 2010 в 06:12
поделиться

3 ответа

Это большая проблема с древовидными структурами данных. Легко определить однородные деревья, но в реальном мире деревья часто состоят из разнородных типов объектов. Хорошим примером этого является файловая система, где дерево содержит диски, папки и файлы.

Вы можете создать дерево, безопасное для типов, только если вы точно знаете форму дерева во время компиляции. Конечно, это исключает все реальные случаи использования деревьев в реальном мире.

2
ответ дан 7 December 2019 в 12:15
поделиться

Что ж, помимо дерева, у вас будут некоторые базовые данные. Например, дерево каталогов. Атрибуты каталога - это его имя и список дочерних каталогов. Начнем с определения общего TreeItem .

public class TreeItem<T> {
  public TreeItem() {
    Children = new List<TreeItem<T>>();
  }

  public void AddChild(T data) {
    Children.Add(new TreeItem<T>{Data = data, Parent = this});
  }

  public List<TreeItem<T>> Children{get;set;}
  public TreeItem<T> Parent {get;set;}
  public T Data {get;set;}
}

Таким образом, простое дерево каталогов - это просто TreeItem :

var directories = new TreeItem<string> { Data="root" };
directories.AddChild("child1");
directories.AddChild("child2");
directories.AddChild("child3");

Это приведет к созданию такого дерева:

root
|- child1
|- child2
|- child3

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

2
ответ дан 7 December 2019 в 12:15
поделиться

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

Но если где-то в коде вам нужен конкретный тип, вам нужно его преобразовать, что может привести к какой-то структуре if-return или if-else-if, например:

SpecificType specType = commonType as SpecificType;
if(specType != null)
{
    //Do something...
    return;
}

AnotherSpecifcType specType2 = commonType as AnotherSpecifcType;
if(specType2 != null)
{
    //Do something...
    return;
}

Но это все, что вы можете сделать .

1
ответ дан 7 December 2019 в 12:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: