2009-02-20 18 views
5

Büyük Öznelik Soru: Sık sık LINQ kullanarak bir nesne kümesini filtrelemek ve sonra sorgudan sonra, sonuçların her birinde bir eylem gerçekleştirmek için eski bir moda foreach yapıyor buluyorum. Bu iki görevi birleştirmenin iyi bir yolu var mıdır, öyle ki, her nesne üzerinde Where() yüklemi ile eşleşen bir eylem gerçekleştirilir mi? Hemen bir Eylemi Seçme() içine geçirmek gibi. Muhtemelen derlemeyecek, ama bir Funco'yu bir boole döndürecek şekilde aktarmaya ne dersiniz, o zaman bunu, hatalarla veya başarılarla bir şeyler yapabilecek başka bir sorgunun içine yerleştirebilirsiniz. Bunu üretim kodunda kimse yaptı mı? Bu kötü bir uygulama olarak kabul edilir mi? Başka düşünceler var mı?Sadece veri seçmek yerine LINQ kullanmak ve eylem yapmak LINQ kullanmak kötü bir uygulamadır?

cevap

8

List<T>, bunun için tasarlanmış bir ForEach() yöntemine sahiptir.

+0

Her biri() isimli IEnumerable için kendi uzantı yöntemimi ekledim. –

2

IEnumerable'da bir uzantı ForEach yöntemi uygulayabilirsiniz.

11

Birçok kişi ForEach yöntemle istediler - ve gerçekten de (biz MoreLINQ bir var neden olan) kullanışlı olduğunu. Aynı zamanda potansiyel olarak tehlikeli.

LINQ'nun çoğu yan etkilerden kesinlikle vazgeçirir. Onlar mümkün, ancak cesaretini kırdı. Bu yüzden OrderBy, mevcut olanları sıralamak yerine yeni koleksiyonları döndürüyor.

Şimdi ForEach'u düşünün - bu bir işlev yerine bir "eylem" dır, çünkü hiçbir şey döndürmez. Herhangi bir yan etkisi yoksa, kesinlikle anlamsızdır! Öyleyse, LINQ felsefesinin bir parçası karşısına çıkıyor - temelde işlevsel bir tarzda şeylere yaklaşmıyor.

Gerçekten ya da buna karşı bir dava yapmaya çalışmıyorum - pratikte bence yararlı bir şey var ve ben yani birçok kütüphanede vb. Şaşırmadım. Çok belirgin. eklemek için sözde operatör. Sadece ne yaptığınızı düşünün ve yan etkileri ortaya çıkardığınızı fark edin. LINQ'in işlevsel stili ile daha zorlayıcı bir kodlama tarzı arasında bir sınır var.

+0

Şimdiye kadar MoreLINQ hakkında bilmiyordum. Şimdi başvuruda bulunuluyor ve ForEach'ınız evimdeki her şeyim yerine kullanılıyor. Thanx! –

+0

Neden IEnumerable üzerinde uygulanmadığına dair büyük açıklama. Teşekkürler! – Thomas