Не является более элегантным решением изменить char[]
на:
static constexpr char * baz = "quz";
Таким образом, мы можем иметь определение / объявление / инициализатор в 1 строке кода.
Попробуйте это:
from TabSection t in content.ChildControls
кроме того, даже если бы это не было доступно (или для различного, будущего сценария можно встретиться), Вы не были бы ограничены преобразованием всего к Спискам. Преобразование в Список вызывает оценку запроса на месте. Но если бы Вы удаляющий вызов ToList, Вы могли бы работать с типом IEnumerable, который продолжил бы задерживать выполнение запроса, пока Вы на самом деле не выполняете итерации или храните в реальном контейнере.
В зависимости от того, что Вы пытаетесь сделать, один из них мог бы добиться цели:
List<Line> parentLineList1 =
(from t in content.ChildControls.OfType<TabSection>()
from p in t.ChildControls.OfType<Paragraph>()
from pl in p.ChildControls.OfType<Line>()
select pl).ToList();
List<Line> parentLineList2 =
(from TabSection t in content.ChildControls
from Paragraph p in t.ChildControls
from Line pl in p.ChildControls
select pl).ToList();
Примечание, что каждый использует OfType< T> (), который Вы использовали. Это отфильтрует результаты и возвратит только объекты указанного типа. Второй запрос неявно использует Cast< T> (), который бросает результаты в указанный тип. Если какой-либо объект не может быть брошен, исключение выдается. Как упомянуто Бурным Интеллектом, необходимо воздержаться от вызова ToList () максимально долго или стараться избегать его в целом.
да можно сделать следующее:
List<TabSection> tabList = (from t in content.ChildControls
where t as TabSection != null
select t as TabSection).ToList();
List<TabSection> tabList = (from t in content.ChildControls
let ts = t as TabSection
where ts != null
select ts).ToList();
И вот форма метода запроса.
List<Line> parentLineList =
content.ChildControls.OfType<TabSections>()
.SelectMany(t => t.ChildControls.OfType<Paragraph>())
.SelectMany(p => p.ChildControls.OfType<Line>())
.ToList();