Получить детей из плоского списка - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть плоский список элементов в ObservableCollection. Эти элементы имеют свойства item.Id и item.Parent.Id. Мне дали идентификатор родителя (верхний уровень), теперь с этим идентификатором мне нужно перебрать список и найти потомков этого родителя. Каждый ребенок может иметь только одного родителя, родитель может иметь несколько детей.

Как я могу сделать это эффективно?

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Вы можете использовать:

var childrenOfParent = theCollection.Where(item => item.Parent.Id == parentId);

Изменить в ответ на комментарии:

Учитывая, что у вас есть иерархический набор данных, я лично сделал бы процедуру, которая проверяет, еслиу данного элемента есть определенный элемент в качестве родителя рекурсивно, например так:

bool HasParent(Item item, int parentId)
{
    if (item.Parent == null)
        return false;
    else if (item.Parent.Id == parentId)
        return true;
    else
        return HasParent(item.Parent, parentId);
}

Учитывая это, вы можете использовать:

var childrenOfParent = theCollection.Where(item => HasParnet(item, parentId));
0 голосов
/ 13 декабря 2011

Что ж, я понял, что если кто-то может оптимизировать / преобразовать этот код во что-то более эффективное, пожалуйста, дайте мне знать, и я отмечу вашу реакцию как ответ. Пока я учусь:).

        foreach (var item in myitemlist) // first put the top level parent in the queue
        {
            if (parentitem.Id == item.Id)
            {
                filteredChildrenQueue.Enqueue(item);
            }
        }

        while (!stillsearching)
        {
            if (filteredChildrenQueue.Count == 0)
            {
                stillsearching = true;

                return;
            }

            FindParentChild();
        }

Продолжайте вызывать этот метод и работайте с первым элементом в очереди

    private void FindParentChild()
    {
        foreach (var item in myitemlist)
        {
            if (item.Parent.Id == filteredChildrenQueue.ElementAt(0).Id)
            {
                filteredChildrenQueue.Enqueue(item);
            }
        }

        filteredChildrenList.Add(filteredChildrenQueue.ElementAt(0));
        filteredChildrenQueue.Dequeue();
    }

FilterChildrenList будет содержать родительский уровень верхнего уровня + все дочерние элементы, которые он содержит.

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