2008-10-18 10 views
5

मैं शायद यहां थोड़ा आलसी हूं, लेकिन मैं सिर्फ LINQ के साथ शुरुआत कर रहा हूं और मेरे पास एक ऐसा कार्य है जो मुझे यकीन है कि LINQ के बजाय दो LINQ क्वेरी (या एक नेस्टेड क्वेरी) में बदल दिया जा सकता है और कुछ foreach बयान। किसी भी LINQ गुरु की देखभाल मेरे लिए एक उदाहरण के रूप में refactor करने के लिए?मैं इस कोड को एक या दो LINQ प्रश्नों में कैसे जोड़ सकता हूं?

समारोह अपने आप में .csproj फ़ाइलों की एक सूची के माध्यम से लूप और सभी .cs परियोजना में शामिल फ़ाइलों के रास्तों बाहर खींचती है:

static IEnumerable<string> FindFiles(IEnumerable<string> projectPaths) 
{    
    string xmlNamespace = "{http://schemas.microsoft.com/developer/msbuild/2003}"; 
    foreach (string projectPath in projectPaths) 
    { 
     XDocument projectXml = XDocument.Load(projectPath); 
     string projectDir = Path.GetDirectoryName(projectPath); 

     var csharpFiles = from c in projectXml.Descendants(xmlNamespace + "Compile") 
           where c.Attribute("Include").Value.EndsWith(".cs") 
           select Path.Combine(projectDir, c.Attribute("Include").Value); 
     foreach (string s in csharpFiles) 
     { 
      yield return s; 
     } 
    } 
} 

उत्तर

8

कैसे के बारे में:

 const string xmlNamespace = "{http://schemas.microsoft.com/developer/msbuild/2003}"; 

     return from projectPath in projectPaths 
       let xml = XDocument.Load(projectPath) 
       let dir = Path.GetDirectoryName(projectPath) 
       from c in xml.Descendants(xmlNamespace + "Compile") 
       where c.Attribute("Include").Value.EndsWith(".cs") 
       select Path.Combine(dir, c.Attribute("Include").Value); 
+0

शानदार। मुझे पता था कि स्टैक ओवरव्लो मुझे एक त्वरित लिंक मिलेगा जितना मैं इसे LINQ पुस्तक पढ़कर खुद को ढूंढ सकता हूं! बहुत बहुत धन्यवाद। –

+0

कोई समस्या नहीं; एक मामूली अनुकूलन के रूप में आप "inc = c.Attribute (" शामिल करें ") दे सकते हैं। मान", और फिर जहां inc.EndsWith (..) inc का चयन करें ... –