2012-02-08 96 views
2

中排除目錄我知道爲什麼當「excl」列表中有多個字符串時,下列代碼不起作用。這是因爲每個字符串都是在lambda中計算的,現在它包含了前一次迭代「x」中排除的任何字符串。我的問題是,我如何才能在最終結果中正確排除多個項目?如何從IEnumerable <DirectoryInfo>

var di = new DirectoryInfo(@"\\192.168.1.10\e$"); 

var excl = new List<string>(); 
excl.Add("Temp"); 
excl.Add("VSS"); 

var dirs = from d in di.GetDirectories() 
      where (d.Attributes & FileAttributes.System) != FileAttributes.System 
      select d;      

dirs = excl 
     .SelectMany(x => from d in dirs 
     where !d.FullName.ToLowerInvariant().Contains(x.ToLowerInvariant()) 
     select d) 
     .Distinct().ToArray(); 

回答

2

像這樣的東西應該工作:

var di = new DirectoryInfo(@"\\192.168.1.10\e$"); 
var dirs = di.EnumerateDirectories() 
      .Where(d=> !excl.Any(e=>d.FullName.ToLowerInvariant().Contains(e))); 

我會考慮你的排除標準,但 - 你想排除包含你排除字符串中的每個目錄或只是目錄名稱比賽排除項目?

此外,爲了加快速度,您可以從排除列表中創建一個HashSet<string>並使用它。

+0

看起來像克里斯·沙恩通過一分鐘擊敗你。我正在研究Intersect <>文檔,並閱讀了hashcodes,但我知道這個問題會有一種解決方案。此代碼僅用於目錄路徑的部分匹配,而不是完全匹配。 – user1197862 2012-02-08 18:56:10

+0

我打了他一分鐘,但沒關係;-) – BrokenGlass 2012-02-08 18:58:11

+0

你說得對,我是先出現他。這是我在這裏的第一個問題,沒有意識到它顯示了最新到最舊的答案,即使它們的編號很清楚!我會轉換答案。 – user1197862 2012-02-08 19:04:17

3

什麼好像你想要做的就是這個(套迭代):

dirs = dirs.Where(d => !excl.Any(x => d.FullName.ToLowerInvariant().Contains(x.ToLowerInvariant()))) 
    .Distinct().ToArray(); 
+0

工作就像一個魅力。謝謝! – user1197862 2012-02-08 18:56:19

+0

對不起,我給你的答案,但沒有意識到你遲到了一分鐘。 – user1197862 2012-02-08 19:04:44

+0

沒有汗水 - 既不@BrokenGlass或我會擔心超過15個代表點:-) – 2012-02-08 19:10:44

相關問題