2012-06-22 3 views
5

Ich bin nicht sicher, dass Titel meine Bedeutung vermittelt, bitte ändern Sie es, wenn Sie diese Frage in einem Satz besser definieren können.C# Casting der Foreach-Wert auf eine seiner Eigenschaften

Ich würde gerne eine Sammlung von T durchlaufen, aber anstatt mit dem (T) -Objekt zu arbeiten, möchte ich (T) object.SomeProperty abrufen.

Wie kann ich es tun:

List<Car> _cars; 
FillList(_cars); 

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

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

Was würde ich gerne tun:

List<Car> _cars; 
FillList(_cars); 

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

irgendeine Weise einen noch faulen Programmierer zu werden?

+0

Ihre zweite Methode ist länger als die erste. Nicht sicher, wie faul das ist. – Paddy

+2

Ja, ich weiß, und ich überlegte, den letzten Satz zu ändern, um faul zu werden, aber ich war zu faul, das zu tun. – Michael

Antwort

14

können Sie LINQ verwenden und wählen Sie:

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

Looping der Sammlung, um eine neue Sammlung zu erstellen, IMO zu durchlaufen ist nicht das beste für Leistung ... –

+0

Ich dachte, LINQ wird nur auflisten, ohne eine ganze neue Sammlung zu erstellen (es sei denn, Sie nennen explizit wie ToList()) –

+1

Es gewann Erstelle keine neue Sammlung. LINQ verwendet die verzögerte Ausführung. Da es im Code keine 'ToList' oder' ToArray' gibt, wird nur "one" foreach und in jedem Schritt eine Windshield erzeugt. – nemesv

1

Verwendung Linq:

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