2009-07-08 3 views
1

У меня есть IEnumerable <DirectoryInfo>, который я хочу отфильтровать, используя массив регулярных выражений, чтобы найти возможные совпадения. Я пытаюсь присоединиться к моим каталогам и строкам регулярных выражений, используя linq, но не может показаться, что это правильно. Вот что я пытаюсь сделать ...Найти сопоставленные каталоги, используя список регулярных выражений

string[] regexStrings = ... // some regex match code here. 

// get all of the directories below some root that match my initial criteria. 
var directories = from d in root.GetDirectories("*", SearchOption.AllDirectories) 
        where (d.Attributes & (FileAttributes.System | FileAttributes.Hidden)) == 0 
         && (d.GetDirectories().Where(dd => (dd.Attributes & (FileAttributes.System | FileAttributes.Hidden)) == 0).Count() > 0// has directories 
          || d.GetFiles().Where(ff => (ff.Attributes & (FileAttributes.Hidden | FileAttributes.System)) == 0).Count() > 0) // has files) 
        select d; 

// filter the list of all directories based on the strings in the regex array 
var filteredDirs = from d in directories 
        join s in regexStrings on Regex.IsMatch(d.FullName, s) // compiler doesn't like this line 
        select d; 

... любые предложения о том, как я могу заставить это работать?

ответ

4

Если вы хотите только каталогов, которые соответствуют всем регулярным выражениям.

var result = directories 
    .Where(d => regexStrings.All(s => Regex.IsMatch(d.FullName, s))); 

Если вам нужны только каталоги, которые соответствуют хотя бы одному регулярному выражению.

var result = directories 
    .Where(d => regexStrings.Any(s => Regex.IsMatch(d.FullName, s))); 
+0

А, хороший звонок на Any(). Я все время забываю об этом! –

+0

Doh! - Я тоже забыл об этом (Any & All). –

0

вам не хватает вашего Где ключевое слово в передней части присоединиться

2

Я не думаю, что подход, вы принимаете это именно то, что вы хотите так или иначе. Это будет проверять имя на ВСЕ строки регулярных выражений, а не на короткое замыкание в первом совпадении. Кроме того, он будет дублировать каталоги, если один соответствует более чем одному шаблону.

Я думаю, что вы хотите что-то вроде:

string[] regexStrings = ... // some regex match code here. 

// get all of the directories below some root that match my initial criteria. 
var directories = from d in root.GetDirectories("*", SearchOption.AllDirectories) 
        where (d.Attributes & (FileAttributes.System | FileAttributes.Hidden)) == 0 
         && (d.GetDirectories().Where(dd => (dd.Attributes & (FileAttributes.System | FileAttributes.Hidden)) == 0).Count() > 0// has directories 
          || d.GetFiles().Where(ff => (ff.Attributes & (FileAttributes.Hidden | FileAttributes.System)) == 0).Count() > 0) // has files) 
        select d; 

// filter the list of all directories based on the strings in the regex array 
var filteredDirs = directories.Where(d => 
    { 
     foreach (string pattern in regexStrings) 
     { 
      if (System.Text.RegularExpressions.Regex.IsMatch(d.FullName, pattern)) 
      { 
       return true; 
      } 
     } 

     return false; 
    }); 
+0

+1 хороший ответ. –

Смежные вопросы