2011-11-30 12 views
2

在我的程序C#中,我使用LINQ來從處理目錄中的所有文件如下如何使用LINQ過濾目錄中的文件?

var FilesToProcess = from filePath in Directory.GetFiles(sDirectory) 
         where File.GetCreationTime(filePath).BusinessDaysUntil(DateTime.Today) 
         select filePath; 
if (FilesToProcess.Any()) 
{ 
    List<string> process = (from string s in FilesToProcess 
          where ((s.EndsWith(".ext")) || (s.EndsWith(".xml"))) 
          select s).ToList(); 
} 

但對我來說,我有喜歡A.XML和A.TXT類似同名的XML和TXT文件B.xml和B.txt和其他人一樣。

我想使用LINQ來處理同名的兩個文件如下

Processfile(字符串XMLFILE,串txtfile)

按我上面的代碼讀取,我得到的所有目錄中的文件(xml,txt),但我不知道要進一步處理。

請幫忙過濾同名但不同擴展名的文件嗎?

回答

9

可以使用Linq GroupBy method要做到這一點,如:

DirectoryInfo directory = new DirectoryInfo(sDirectory); 
var filePairs = directory 
      .GetFiles("*.xml") 
      .Union(directory.GetFiles("*.txt")) 
      .GroupBy(file => file.Name); 

或者,如果你希望得到公正的文件中對:

var filePairs = directory 
      .GetFiles("*.xml") 
      .Union(directory.GetFiles("*.txt")) 
      .GroupBy(file => file.Name) 
      .Select(grp => new 
      { 
       XmlFile = grp.FirstOrDefault(file => file.Extension == "xml"), 
       TxtFile = grp.FirstOrDefault(file => file.Extension == "txt") 
      }) 
      .Where(pair => pair.XmlFile != null && pair.TxtFile!= null); 
+0

如果使用.NET4或更高版本,它可能是更好地使用['EnumerateFiles'](http://msdn.microsoft.com/en-us/library/system.io.directory.enumeratefiles.aspx)而不是'GetFiles':它將流式傳輸結果而不是撞擊出單個數組。 – LukeH

+0

我用上面的代碼,我在目錄中有2個txt和2個xml文件。我得到空。你能幫助我做了什麼錯誤,我複製了完全相同的代碼 –

+0

@HemantKothiyal請發佈你的更新代碼和你得到的錯誤。 –