Вопрос

У меня есть общий список.

Некоторые элементы этого списка принадлежат родительскому элементу.Я получил все эти элементы из базы данных и хочу рекурсивно построить с их помощью дерево.

Итак, вот что я думаю:

Вот мой предикат:

public static bool FindChildren(Int32 parentId,CategoryMapping catMapping)
{
    if (catMapping.parentId == parentId)
    {
        return true;
    }
    else
    {
        return false;
    }
}

root = list[0];
root.childrenElements = root.FindAll(FindChildren(root.id,???)

Я не могу понять, как это будет работать.Как я могу сделать такой предикат?

ПС:Я использую VS2005 :(

Это было полезно?

Решение

Пытаться

root.childrenElements = 
    root
       .Where( i => i.parentId == yourCatMapping.parentId)
       .ToArray();

РЕДАКТИРОВАТЬ

Я думаю, что в .net 2.0 это так.

root.FindAll(
    delegate(CategoryMapping mapping)
        {
             return mapping.parentId == root.Id;
        });

Другие советы

Вам нужно указать делегата для перехода к FindAll, а не прямой вызов функции

(при условии root является List<CategoryMapping>)

root.childrenElements = root.FindAll(c => FindChildren(root.id, c));

Вам стоит заглянуть в эту тему, которую я начал Формирование хороших делегатов предикатов для Find() или FindAll() в списке для С#/.NET 2.0

Это довольно четко отвечает на ваш вопрос.

Ответ Грегуара — лучший, потому что он:

  1. Не использует LINQ (спрашивающий использует VS 2005)
  2. Не использует лямбда-выражение (опять же, VS 2005).

Тем не менее, почему бы не упростить себе задачу (немного) написав функцию для генерации вашего Predicate для ты:

public static Predicate<CategoryMapping> GetIsChildOf(int parentId) {
    return delegate(CategoryMapping cm) {
        return cm.parentId == parentId;
    };
}

Тогда, если у вас есть List<CategoryMapping> и вы хотите найти все элементы с определенным parentId недвижимость, вы можете просто позвонить:

root = list[0];
root.childrenElements = list.FindAll(GetIsChildOf(root.id));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top