Рекурсивный выбор похожих объектов (LINQ) - PullRequest
1 голос
/ 11 января 2010

У меня есть небольшая ситуация с подобными объектами - в основном, каждый объект реализует коллекцию базового типа. Итак ...

Элемент1 - Список предметов2 - List Items3

Публичный список Specials {get; задавать; }

Item2: Item1 Item3: Item1

Special { public int Value {get; задавать; } публичная строка Name {get; задавать; } }

Теперь я могу просто пойти по дереву и получить вещи - но я хочу в основном хотеть получить все "особые" экземпляры классов из всего объекта, вплоть до дерева - в одну коллекцию. 1011 *

Возможно ли это с помощью LINQ? или мне просто нужно полагаться на очень замысловатые петли?

1 Ответ

2 голосов
/ 12 января 2010

Вы можете использовать Linq в сочетании с рекурсивными функциями:

static IEnumerable<Special> getSpecials(Item1 item1)
{
    var item2Specials = item1.Items2.SelectMany(item2 => getSpecials(item2));
    var item3Specials = item1.Items3.SelectMany(item3 => getSpecials(item3));
    return item1.Specials.Concat(item2Specials).Concat(item3Specials);
}

Мне было немного трудно понять ваши обозначения структуры вашего класса. Я предполагаю, что вы имели в виду следующие классы C #:

class Item1
{
    public List<Item2> Items2 = new List<Item2>();
    public List<Item3> Items3 = new List<Item3>();
    public List<Special> Specials = new List<Special>();
}

class Item2 : Item1 { }
class Item3 : Item1 { }

class Special
{
    public int Value { get; set; }
    public string Name { get; set; }
}

Я также предполагаю, что вы имеете в виду Linq-to-objects, а не Linq-to-SQL. Если вы хотите сохранить иерархические данные в базе данных, вам не следует этого делать, а вместо этого посмотрите на модель вложенного набора .

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