2012-06-22 2 views
5

Nie jestem pewien, czy tytuł przenosi moje znaczenie, proszę go zmienić, jeśli potrafisz lepiej zdefiniować to pytanie w zdaniu.C# Rzucanie wartości Foreach do jednej z jego właściwości

Chciałbym iterować przez zbiór T, ale zamiast pracy z obiektem (T), chcę pobrać obiekt (T). Właściwość domyślna.

Jak mogę to zrobić:

List<Car> _cars; 
FillList(_cars); 

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

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

Co chciałbym zrobić:

List<Car> _cars; 
FillList(_cars); 

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

jakiś sposób, aby stać się jeszcze bardziej leniwy programista?

+0

Twoja druga metoda jest dłuższa niż pierwsza. Nie jestem pewien, jak leniwy to jest. – Paddy

+2

Tak, wiem, i rozważałem zmianę ostatniego zdania, aby usunąć leniwych, ale byłem zbyt leniwy, aby to zrobić. – Michael

Odpowiedz

14

Można używać LINQ wybierz:

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

Zapętlenie kolekcji, aby zbudować nową kolekcję do przechodzenia przez IMO, nie jest najlepsze dla wydajności ... –

+0

Myślałem, że LINQ po prostu wyliczy, nie budując zupełnie nowej kolekcji (chyba że jawnie nazwiesz ToList()) –

+1

Wygrał nie utworzysz nowej kolekcji. LINQ używa odroczonego wykonania. Ponieważ w kodzie nie ma "ToList" lub "ToArray", po prostu zrobi on "jeden" foreach i wyda jedną Windshield w każdym kroku. – nemesv

1

używać LINQ:

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