Предикаты и Списки - PullRequest
       315

Предикаты и Списки

0 голосов
/ 16 марта 2010

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

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

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

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

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,???)

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

PS: я использую VS2005: (

Ответы [ 4 ]

3 голосов
/ 16 марта 2010

Попробуйте

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

EDIT

В .net 2.0 я думаю, что это

root.FindAll(
    delegate(CategoryMapping mapping)
        {
             return mapping.parentId == root.Id;
        });
1 голос
/ 16 марта 2010

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

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

1 голос
/ 16 марта 2010

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

(при условии root равно List<CategoryMapping>)

root.childrenElements = root.FindAll(c => FindChildren(root.id, c));
0 голосов
/ 16 марта 2010

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

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

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

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));
...