У меня древовидная структура. Каждый элемент в этой структуре должен иметь возможность возвращать Enumerable всех элементов, к которым он относится. Давайте назовем этот метод IEnumerable<Foo> GetAll()
. Так что, если у нас есть
A <-- topmost root
/ \
B C
/ \ / \
D E F G
вызов GetAll
для элемента C
возвращает {C, F, G}
(фиксированный порядок элементов был бы хорош, но не нужен). Думаю, все это уже знали.
Текущая реализация GetAll
выглядит следующим образом:
public IEnumerable<Foo> GetAll ()
{
yield return this;
foreach (Foo foo in MyChildren) {
foreach (Foo f in foo.GetAll ()) {
yield return f;
}
}
}
В более ранней реализации я возвратил List и добавил child-foos, используя List.AddRange()
.
Мой вопрос заключается в том, правильно ли реализована версия, использующая yield, или ее следует улучшить (особенно с точки зрения производительности). Или это просто плохо, и я должен вместо этого придерживаться List
s (или ReadOnlyCollections
)?