2012-06-22 17 views
5

Başlığın anlamımı ilettiğinden emin değilim, bu soruyu bir cümlede daha iyi tanımlayabiliyorsanız lütfen değiştirin.C# Foreach değerini özelliklerinden birine getirme

Bir T koleksiyonuyla yinelemek istiyorum, ancak (T) nesnesiyle çalışmak yerine, object.omeProperty (T) nesnesini almak istiyorum.

Bunu yapabilen nasıl

List<Car> _cars; 
FillList(_cars); 

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

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

ben yapmak isterim Ne:

List<Car> _cars; 
FillList(_cars); 

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

daha lazier programcı olmaya Herhangi yolu?

+0

Sizin ikinci yöntem ilk daha uzundur. Ne kadar tembel olduğundan emin değilim. – Paddy

+2

Evet, biliyorum ve tembelliği gidermek için son cümleyi değiştirmeyi düşündüm, ama bunu yapmak için çok tembel davrandım. – Michael

cevap

14

Sen LINQ kullanmak ve seçebilirsiniz:

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

IMO üzerinden döngü için yeni bir koleksiyon oluşturmak için koleksiyonun döngülenmesi performans için en iyi değil ... –

+0

LINQ sadece yeni bir koleksiyon oluşturmadan numaralandıracağınızı düşündüm (açık bir şekilde ToList() gibi bir şey aramadıkça) –

+1

Kazandı Yeni bir koleksiyon oluşturmayın. LINQ ertelenmiş yürütmeyi kullanır. Kodda "ToList" veya "ToArray" bulunmadığı için foreach'i "one" yapacak ve her adımda bir Windshield verecektir. – nemesv

1

kullanım Linq:

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