c# - net - linq parse int
Hacer un cast dentro de una consulta LINQ (5)
Dependiendo de lo que trates de hacer, uno de estos puede hacer el truco:
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();
Tenga en cuenta que uno usa OfType <T> (), que estaba usando. Esto filtrará los resultados y devolverá solo los elementos del tipo especificado. La segunda consulta usa implícitamente Cast <T> (), que arroja los resultados en el tipo especificado. Si no se puede lanzar ningún elemento, se lanza una excepción. Como mencionó Turbulent Intellect, debe abstenerse de llamar a ToList () el mayor tiempo posible, o tratar de evitarlo por completo.
¿Es posible hacer un molde dentro de una consulta LINQ (por el bien del compilador)?
El siguiente código no es terrible, pero sería bueno hacerlo en una consulta:
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();
El código continúa con algunas consultas más, pero la esencia es que tengo que crear una lista de cada consulta para que el compilador sepa que todos los objetos en content.ChildControls
son de tipo TabSection
y todos los objetos en t.ChildControls
son del tipo Paragraph
... y así sucesivamente y así sucesivamente.
¿Hay alguna manera dentro de la consulta LINQ para decirle al compilador que t
from t in content.ChildControls
es una TabSection
?
Prueba esto:
from TabSection t in content.ChildControls
Además, incluso si esto no estuviera disponible (o para un escenario futuro diferente que pueda encontrar), no estaría restringido a convertir todo en Listas. La conversión a una lista provoca una evaluación de la consulta sobre el terreno. Pero si elimina la llamada a la lista, podría trabajar con el tipo IEnumerable, que continuaría difiriendo la ejecución de la consulta hasta que realmente itere o almacene en un contenedor real.
Y aquí está el formulario de método de consulta.
List<Line> parentLineList =
content.ChildControls.OfType<TabSections>()
.SelectMany(t => t.ChildControls.OfType<Paragraph>())
.SelectMany(p => p.ChildControls.OfType<Line>())
.ToList();
sí, puedes hacer lo siguiente:
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();