Как я возвращаю предков объекта с LINQ?

У меня есть Окружной класс, который похож на это:

public class District
{
    public int Id { get; set; }
    public string Name { get; set; }
    public District Parent { get; set; }
    public IEnumerable<District> Ancestors { get { /* what goes here? */ } }
}

Я хотел бы смочь получить список предков каждого Района. Таким образом, если Район "1.1.1" является ребенком Района "1.1", который является ребенком Района "1", получение Предков на Районе "1.1.1" возвратило бы список, который содержит Окружные объекты, имена которых "1.1" и "1".

Это включает оператор возврата урожая (я никогда полностью понял это)? Это может быть сделано в одной строке?

5
задан Chris 13 May 2010 в 05:09
поделиться

2 ответа

Все можно сделать в одной строке, если строка достаточно длинная :)

В этом случае, вероятно, самый простой , выполненный не одной строкой:

public IEnumerable<District> Ancestors
{
    get
    {
        District parent = Parent;
        while (parent != null)
        {
            yield return parent;
            parent = parent.Parent;
        }
    }
}

Просто краткая вставка, если вы хотите лучше понять yield return - глава 6 первого издания C # in Depth все еще доступна бесплатно, и это все об итераторах в C # 2. Возьмите ее со страницы первого издания ].

11
ответ дан 18 December 2019 в 14:43
поделиться

Вы можете рассмотреть эту альтернативу .... это не такой "чистый", но очень эффективный способ легко запрашивать подобные вещи. (независимо от того, используется ли sql или нет)

SQL выбирает потомков строки

см. ответ «Принято»

единственное, что я бы добавил, это разделитель между тегами

а затем запрос с использованием linq

ancestors = Districts.Where( d => 
       d.Pedigree.Contains(Id) && 
       d.Pedigree.Length < Pedigree)
       .ToList();

в большинстве случаев, если вы используете ORM, это приведет к единственному запросу, а не к множеству запросов при попытке итерации дерева

на самом деле в этом случае с одним родителем это еще проще, поскольку ваша родословная будет содержать ваши родословная, но если у вас была ветвящаяся родословная ..... :)

1
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: