Поиск всех объектов типа T в древовидной структуре C # - PullRequest
4 голосов
/ 09 апреля 2009

Мне нужно написать метод поиска в дереве, который принимает параметр типа T и возвращает все элементы типа T, которые существуют в дереве. Есть какой-либо способ сделать это? На этом этапе я предпочел бы элегантность, а не эффективность ...

Ответы [ 4 ]

2 голосов
/ 09 апреля 2009

Примерно так:

internal static IEnumerable<T> AllDescendantNodes<T>( this TreeNode input ) 
    where T class;
{
    T current = null;
    foreach ( TreeNode node in input.Nodes )
        if( (current = node as T) != null )
        {
            yield return current;
            foreach ( var subnode in node.AllDescendantNodes<T>() )
                yield return subnode;
        }
}

Затем вы вызываете это для корневого узла как метод расширения:

foreach( MyCustomNodeClass item in rootNode.AllDescendantNodes<MyCustomNodeClass>() ) 
{
    ...
}
2 голосов
/ 09 апреля 2009

Что ж, внутренне метод должен был бы выполнять итерации по всем элементам дерева, поэтому перейдем к простому перечислению по нему и использованию метода OfType LINQ не так уж и далеко:

var onlyTs = yourTree.OfType<SomeT>();
1 голос
/ 09 апреля 2009

То, что вам нужно, - это базовая функция обхода дерева (предварительный заказ, внутренний или почтовый заказ - это не имеет значения) и функция фильтра. Затем вы можете собрать эти два вместе и получить то, что вам нужно:

IEnumerable<T> Traverse(Tree<T> tree)
{
    yield return tree.Data;

    foreach(Tree<T> subtree in tree.Subtrees)
        foreach(T t in Traverse(subtree))
            yield return t;
}

IEnumerable<U> Filter<T, U>(IEnumerable<T> source)        
    where U : T
{
    foreach(T t in source)
        if(t is U)
            yield return (U)t;
}
1 голос
/ 09 апреля 2009

Предполагая, что ваше дерево является общим. т.е. Item<T>.

int count = yourTree.Count(p => p == typeof(T));

В противном случае, проанализируйте каждый узел и сравните «item == typeof(T)»

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