2012-09-07 17 views
6

मेरे पास आपके लिए linq विशेषज्ञों के लिए एक प्रश्न है! घटक उदाहरणों की एक नेस्टेड सूची में, मुझे यह जानने की ज़रूरत है कि इसमें किसी विशेष प्रकार का कोई घटक है या नहीं। क्या यह linq द्वारा व्यक्त किया जा सकता है? ध्यान रखें कि आवेदन हो सकता है। कॉम्पोनेंट्स [0]। कॉम्पोनेंट्स [0]। कॉम्पोनेंट्स [0] ... मेरा प्रश्न linq में रिकर्सिव प्रश्नों के लिए उन्मुख है!linq नेस्टेड सूची में

मैं आपको मॉडल के बारे में कुछ विचार रखने के लिए इकाइयों को छोड़ देता हूं।

public class Application 
{ 
    public List<Component> Components { get; set; } 
} 

public class Component 
{ 
    public ComponentType Type { get; set; } 
    public List<Component> Components { get; set; } 
} 

public enum ComponentType 
{ 
    WindowsService, 
    WebApplication, 
    WebService, 
    ComponentGroup 
} 

उत्तर

5

आप जानना चाहते हैं कि एक घटक में घटकों के किसी भी दिए गए प्रकार का है चाहता हूँ कर सकते हैं?

var webType = ComponentType.WebApplication; 
IEnumerable<Component> webApps = from c in components 
           from innerComp in c.Components 
           where innerComp.Type == webType; 
bool anyWebApp = webApps.Any(); 

क्या innercomp.components के बारे में?

संपादित: तो आप ऊपर या दूसरे स्तर पर पुनरावर्ती केवल नहीं दिए गए प्रकार का घटक लगाना चाहते हैं।

public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> fnRecurse) 
{ 
    foreach (T item in source) 
    { 
     yield return item; 

     IEnumerable<T> seqRecurse = fnRecurse(item); 
     if (seqRecurse != null) 
     { 
      foreach (T itemRecurse in Traverse(seqRecurse, fnRecurse)) 
      { 
       yield return itemRecurse; 
      } 
     } 
    } 
} 

इस तरह से इस्तेमाल किया जा रहा:

var webType = ComponentType.WebApplication; 
IEnumerable<Component> webApps = components.Traverse(c => c.Components) 
           .Where(c => c.Type == webType); 
bool anyWebApp = webApps.Any(); 

नमूना डेटा:

var components = new List<Component>() { 
    new Component(){ Type=ComponentType.WebService,Components=null }, 
    new Component(){ Type=ComponentType.WebService,Components=new List<Component>(){ 
     new Component(){ Type=ComponentType.WebService,Components=null }, 
     new Component(){ Type=ComponentType.ComponentGroup,Components=null }, 
     new Component(){ Type=ComponentType.WindowsService,Components=null }, 
    } }, 
    new Component(){ Type=ComponentType.WebService,Components=null }, 
    new Component(){ Type=ComponentType.WebService,Components=new List<Component>(){ 
     new Component(){ Type=ComponentType.WebService,Components=new List<Component>(){ 
      new Component(){Type=ComponentType.WebApplication,Components=null} 
     } }, 
     new Component(){ Type=ComponentType.WindowsService,Components=null }, 
     new Component(){ Type=ComponentType.WebService,Components=null }, 
    } }, 
    new Component(){ Type=ComponentType.WebService,Components=null }, 
    new Component(){ Type=ComponentType.ComponentGroup,Components=null }, 
    new Component(){ Type=ComponentType.WebService,Components=null }, 
}; 
+0

innercomp.components के बारे में क्या? –

+0

@IrrationalRationalWorks: मेरा जवाब संपादित किया। –

+0

मैं बारिश खा रहा हूं ... मुझे –

1
if(Components.Any(c => c.Type == ComponentType.WindowsService)) 
{ 
    // do something 
} 

या आप

var listContainsAtLeastOneService = 
    (from c in Components 
     where c.Type == ComponentType.WindowsService 
     select c).Any(); 
+0

क्या c.components के बारे में तो आप निम्नलिखित Traverse विस्तार विधि का उपयोग कर सकते हैं? –

संबंधित मुद्दे