2012-06-22 4 views
5

No estoy seguro de que el título transmita mi significado; cámbielo si puede definir mejor esta pregunta en una oración.C# Lanzando el valor de Foreach a una de sus propiedades

Me gustaría iterar a través de una colección de T, pero en lugar de trabajar con el objeto (T), quiero recuperar (T) object.SomeProperty.

¿Cómo puedo hacerlo:

List<Car> _cars; 
FillList(_cars); 

foreach (Car car in _cars) 
{ 
    Windshield ws = car.Windshield; 

    ws.DoWorkA(); 
    ws.DoWorkB(); 
    ws.DoWorkC(); 
} 

Lo que me gusta hacer:

List<Car> _cars; 
FillList(_cars); 

foreach (Car car in _cars using ws as Windshield = car.Windshield) 
{ 
    ws.DoWorkA(); 
    ws.DoWorkB(); 
    ws.DoWorkC(); 
} 

Cualquier forma de convertirse en un programador incluso más perezoso?

+0

El segundo método es más largo que el primero. No estoy seguro de qué vago es eso. – Paddy

+2

Sí, lo sé, y consideré cambiar la última oración para quitar el vago, pero era demasiado flojo para hacerlo. – Michael

Respuesta

14

Puede utilizar LINQ y seleccionar:

foreach (Windshield ws in _cars.Select(car => car.Windshield)) 
{ 
    ws.DoWorkA(); 
    ws.DoWorkB(); 
    ws.DoWorkC(); 
} 
+1

Looping la colección para construir una nueva colección para recorrer IMO no es la mejor para el rendimiento ... –

+0

Pensé que LINQ simplemente enumerará sin construir una colección completamente nueva (a menos que explícitamente llame a algo como ToList()) –

+1

Ganó crear una nueva colección LINQ usa ejecución diferida. Debido a que no hay 'ToList' o' ToArray' en el código, solo hará "one" foreach y generará un Windshield en cada paso. – nemesv

1

uso de LINQ:

List<Car> _cars; 
FillList(_cars); 
foreach (Windshield ws in _cars.Select(c=>c.Windshield) { 
     ws.DoWorkA(); 
     ws.DoWorkB(); 
     ws.DoWorkC(); 
    } 
Cuestiones relacionadas