是否可以在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();
代码继续增加一些查询,但要点是我必须在每个查询中创建一个List,以便编译器知道content.ChildControls
中的所有对象都是TabSection
类型1}} t.ChildControls
中的所有对象都属于Paragraph
类型......依此类推。依此类推。
在LINQ查询中是否有办法告诉编译器t
中的from t in content.ChildControls
是TabSection
?
答案 0 :(得分:27)
试试这个:
from TabSection t in content.ChildControls
此外,即使这不可用(或者您可能遇到的其他未来情景),您也不会将所有内容转换为列表。转换为List会导致现场查询评估。但是如果删除ToList调用,则可以使用IEnumerable类型,这将继续推迟查询的执行,直到您实际迭代或存储在真实容器中。
答案 1 :(得分:9)
根据您的目的,其中一个可能会起到作用:
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&lt; T&gt;()。这将过滤结果并仅返回指定类型的项目。第二个查询隐式使用Cast&lt; T&gt;(),它将结果转换为指定的类型。如果无法转换任何项目,则抛出异常。正如Turbulent Intellect所提到的,你应该尽可能地避免调用ToList(),或者尽量避免使用它。
答案 2 :(得分:2)
List<TabSection> tabList = (from t in content.ChildControls
let ts = t as TabSection
where ts != null
select ts).ToList();
答案 3 :(得分:1)
是的,您可以执行以下操作:
List<TabSection> tabList = (from t in content.ChildControls
where t as TabSection != null
select t as TabSection).ToList();
答案 4 :(得分:1)
这是查询方法表单。
List<Line> parentLineList =
content.ChildControls.OfType<TabSections>()
.SelectMany(t => t.ChildControls.OfType<Paragraph>())
.SelectMany(p => p.ChildControls.OfType<Line>())
.ToList();