Можно ли выполнить приведение в запросе LINQ (для компилятора)?
Следующий код не страшен, но было бы неплохо объединить его в один запрос:
Content content = dataStore.RootControl as Controls.Content;
List<TabSection> tabList = (from t in content.ChildControls
select t).OfType<TabSection>().ToList();
List<Paragraph> paragraphList = (from t in tabList
from p in t.ChildControls
select p).OfType<Paragraph>().ToList();
List<Line> parentLineList = (from p in paragraphList
from pl in p.ChildControls
select pl).OfType<Line>().ToList();
Код продолжается еще несколькими запросами, но суть в том, что я должен создать список из каждого запроса, чтобы компилятор знал, что все объекты в content.ChildControls имеют тип TabSection, а все объекты в t.ChildControls являются типа Paragraph ... и так далее, и тому подобное.
Есть ли способ в запросе LINQ сообщить компилятору, что t в from t in content.ChildControls является TabSection?





Попробуй это:
from TabSection t in content.ChildControls
Кроме того, даже если бы это было недоступно (или для другого будущего сценария, с которым вы можете столкнуться), вы не были бы ограничены преобразованием всего в списки. Преобразование в список вызывает немедленную оценку запроса. Но если вы удалите вызов ToList, вы можете работать с типом IEnumerable, который продолжит откладывать выполнение запроса до тех пор, пока вы не выполните итерацию или не сохраните в реальном контейнере.
да, вы можете сделать следующее:
List<TabSection> tabList = (from t in content.ChildControls
where t as TabSection != null
select t as TabSection).ToList();
В зависимости от того, что вы пытаетесь сделать, один из них может помочь:
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> (), который преобразует результаты в указанный тип. Если какой-либо элемент не может быть приведен, генерируется исключение. Как упоминалось в Turbulent Intellect, вам следует воздерживаться от вызова ToList () как можно дольше или стараться избегать его вообще.
А вот форма метода запроса.
List<Line> parentLineList =
content.ChildControls.OfType<TabSections>()
.SelectMany(t => t.ChildControls.OfType<Paragraph>())
.SelectMany(p => p.ChildControls.OfType<Line>())
.ToList();
List<TabSection> tabList = (from t in content.ChildControls
let ts = t as TabSection
where ts != null
select ts).ToList();
Для этого нужен OfType <T> ().
Размышляя над OfType <T> (), я пришел к выводу, что он менее эффективен, чем мое решение.
Для этого нужен OfType <T> ().