2010-02-11 15 views
9

Bir süredir LINQ kullanıyorum (ve keyfini çıkarın), ancak .NET özel koleksiyonları (DataRowCollection, ControlCollection) ile karşılaştığımda bir hız topu çarptı gibi geliyor. LINQ'yi bu özel denetimlerle kullanmanın bir yolu var mı ve Microsoft'un bunu bir sonraki sürümde yayınlayacağını düşünmüyor musunuz? Ya da bunları LINQ olmayan yol üzerinde yinelemeye mi yoksa koleksiyondaki eşyaları LINQ-mümkün koleksiyonlara kendimiz mi çekeceğiz?Microsoft, tüm koleksiyonları LINQ tarafından kullanılabilir hale getirecek mi?

cevap

21

ControlCollection gibi koleksiyonların LINQ ile çalışmadığının nedeni, güçlü yazılmadıklarıdır. Bir eleman türü olmadan LINQ, güçlü yazılan yöntemler oluşturamaz. Türü bildiğiniz sürece, güçlü bir şekilde yazılan numaralandırma oluşturmak ve dolayısıyla LINQ ile kullanmak için Cast yöntemini kullanabilirsiniz.

ControlCollection col = ... 
var query = col.Cast<Control>().Where(x => ...); 

Microsoft şimdiye yapmak irâde gelince Örneğin

için bu varsayılan olarak IEnumerable<T> uygularlar. Benim tahminim burada yok. Bunun sebebi, bunu yapmanın kırılmada bir değişiklik olması ve kodda beklenen davranışa neden olabilmesidir. Sadece ControlCollection için IEnumerable<Control>'un uygulanması bile, kullanıcı uygulamalarını kesebilecek ve neredeyse kesin olarak kesebilecek aşırı yüklenme çözünürlüğünde değişikliklere neden olabilir.

+0

Bu cevaptır. Yayınlamayı unuttum. Microsoft, hala ControlCollection ve benzeri için Strongly Type Koleksiyonlar ekleyebilir. Katkıda bulunan herkese teşekkürler. –

+0

Neden gerçekten Microsoft, ControlCollection'ı güçlü bir şekilde yazılmış bir koleksiyon olarak (Kontrol türünde) yapmamıştır? – BornToCode

1

Bunun nedeni: IQueryable IEnumerable<T> uygulamak veya yok Koleksiyonları, LINQ yinelenebiliyorsa edilemez

+0

, IEnumerable

+1

olmalıdır. Eh, tüm koleksiyonlar IEnumerable uygular (aksi takdirde onlar üzerinde döngü mümkün olmaz). Ancak linq tarafından kullanılabilmeleri için genel sürümü (IEnumerable ) uygulamak zorunda kalacaklar. –

+0

IEnumerable'ın Genel sürümünden bahsettim, ancak SOF (Text Editor) bunu yapmama izin vermeyecek. Erken farketmedim, düzeltmeyi yaptım. Yine de teşekkürler –

4
Böyle bir şey yapmak mümkün olmalıdır

: Linq

myDataRowCollection.Cast<DataRow>().Where..... 

ve kullanan yol. Koleksiyondaki nesnelerin ne olduğunu biliyorsanız, bunu kullanabilmeniz gerekir.

İlgili konular