2008-10-01 19 views
28

Bir LINQ sorgusunda (derleyicinin hatırı için) bir döküm yapmak mümkün mü?LINQ Sorgusu İçinde Bir Döküm Yapmak

Aşağıdaki kod korkunç değil, ama bir sorgunun dönüştürebilmek için iyi olurdu:

Content content = dataStore.RootControl as Controls.Content; 

List<TabSection> tabList = (from t in content.ChildControls 
          select t).OfType<TabSection>().ToList(); 

List<Paragraph> paragraphList = (from t in tabList 
           from p in t.ChildControls 
           select p).OfType<Paragraph>().ToList(); 

List<Line> parentLineList = (from p in paragraphList 
          from pl in p.ChildControls 
          select pl).OfType<Line>().ToList(); 

kod birkaç sorgu ile devam eder, ama yüreğin bir oluşturmak zorunda olduğunu Derleyicinin content.ChildControls'daki tüm nesnelerin TabSection türünde olduğunu ve t.ChildControls'daki tüm nesnelerin Paragraph türünde olduğunu bilmesi için her bir sorgunun listesini listeleyebilirsiniz.

LINQ sorgusunda, derleyiciye from t in content.ChildControls numaralı t'un TabSection olduğunu bildirmenin bir yolu var mı? Bu mevcut değildi bile, Ayrıca

from TabSection t in content.ChildControls 

(veya karşılaşabileceğiniz farklı, gelecekteki senaryo için), sen Listelerine şeyi dönüştürme sınırlı olmaz:

cevap

25

bu deneyin. Listeye dönüştürme, yerinde sorgu değerlendirmesine neden olur. Ancak, ToList çağrısını kaldırırsanız, gerçekten yinelenen veya gerçek bir kapsayıcıda depolanana kadar sorgunun yürütülmesini ertelemeye devam edecek IEnumerable türüyle çalışabilirsiniz.

List<TabSection> tabList = (from t in content.ChildControls 
          where t as TabSection != null 
          select t as TabSection).ToList(); 
1

evet aşağıdakileri yapabilirsiniz tek OfType <T> kullanır

List<Line> parentLineList1 = 
    (from t in content.ChildControls.OfType<TabSection>() 
    from p in t.ChildControls.OfType<Paragraph>() 
    from pl in p.ChildControls.OfType<Line>() 
    select pl).ToList(); 

List<Line> parentLineList2 = 
    (from TabSection t in content.ChildControls 
    from Paragraph p in t.ChildControls 
    from Line pl in p.ChildControls 
    select pl).ToList(); 

Not olduğunu(), kullandığınız. Bu, sonuçları filtreleyecek ve yalnızca belirtilen türdeki öğeleri döndürecektir. İkinci sorgu, sonuçları belirtilen türe dönüştüren Cast <T>() yöntemini kullanır. Herhangi bir öğe yayınlanamazsa, bir istisna atılır. Türbülanslı Akıl tarafından da belirtildiği gibi, mümkün olduğunca uzun bir süre ToList() 'i çağırmaktan kaçınmalı ya da bundan kaçınmaya çalışmalısınız.

+0

içindir. – Lucas

9

Yapmaya çalıştığınız ne bağlı olarak, bunlardan biri yapabilir hile:

1

Ve burada sorgu yöntemi formu.() OfType ne

List<Line> parentLineList = 
    content.ChildControls.OfType<TabSections>() 
    .SelectMany(t => t.ChildControls.OfType<Paragraph>()) 
    .SelectMany(p => p.ChildControls.OfType<Line>()) 
    .ToList(); 
2
List<TabSection> tabList = (from t in content.ChildControls 
          let ts = t as TabSection 
          where ts != null 
          select ts).ToList(); 
+0

Bu, OfType () için nedir. – Lucas

+0

OfType üzerinde yansıtma () çözümümden daha az verimli olduğu sonucuna getirdi. –

İlgili konular