LINQ на сложной вложенной наблюдаемой коллекции - PullRequest
0 голосов
/ 28 июня 2011

У меня есть вложенный ObservableCollection<Student>, откуда я могу получить конкретного студента на основе значения Id, используя LINQ или Lambda? Вот мой студенческий класс:

public class Student
    {

        public Student()
        {

        }

        public string Name;
        public int ID;
        public ObservableCollection<Student> StudLists;
    }

Таким образом, у каждого объекта ученика могут быть снова коллекции учеников, и он может идти как любое количество вложенных уровней. как мы можем сделать это LINQ или используя Lambda? Я пробовал с

var studs = StudCollections.Where(c => c.StudLists.Any(m => m.ID == 122));

Но это не дает точный предмет ученика? Есть идеи?

1 Ответ

1 голос
/ 28 июня 2011

Если вы хотите найти всех потомков StudCollections, вы можете написать метод расширения, например, так:

static public class LinqExtensions
{
  static public IEnumerable<T> Descendants<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> DescendBy)
  {
    foreach (T value in source)
    {
        yield return value;

        foreach (T child in DescendBy(value).Descendants<T>(DescendBy))
        {
            yield return child;
        }
    }
  }
}

и использовать его так:

var students = StudCollections.Descendants(s => s.StudLists).Where(s => s.ID == 122);

ЕслиВы хотите одного студента с соответствующим идентификатором, используйте:

var student = StudCollections.Descendants(s => s.StudLists).FirstOrDefault(s => s.ID == 122);

if (student != null)
{
  // access student info here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...