linq提取特定子集

时间:2011-08-25 13:50:03

标签: linq linq-to-objects

给定一个文件目录(作为FileInfo数组),我将如何提取具有特定扩展名的相应文件名的所有文件名。

例如,给定以下文件的目录;

file1.txt
file1.txt.xml
file2.txt
file2.txt.xml
file3.xml
file3.xml.xml

如何提取file1.txt,file2.txt和file3.xml。基本上,我正在寻找任何具有我的给定扩展名的对应条目的文件(在这种情况下为xml)。

提前致谢。

4 个答案:

答案 0 :(得分:2)

此代码将生成相应文件的列表(假设文件为IEnumerable<FileInfo>

var ext = ".xml"; // To match your example above
var list = files.Where(f => f.Extension.Equals(ext, StringComparison.OrdinalIgnoreCase))
                .Select( f => Path.Combine(f.DirectoryName, Path.GetFileNameWithoutExtension(f.Name)))
                .Where( n => File.Exists(n))
                .ToList();

答案 1 :(得分:1)

詹姆斯的解决方案有效。您也可以使用

files.Where(fi => fi.Extension == ext).ToList();

答案 2 :(得分:1)

你可以选择像

这样的东西
string path = @"C:\Temp\XYZ";
string mainExtension = ".txt"; // optionally use
string companionExtension = ".xml";

var mainFiles = Directory.GetFiles(path); // or (path, "*" + mainExtension); 
var companionFiles = Directory.GetFiles(path, "*" + companionExtension);

var filesWithCompanions = from file in mainFiles
                            from companion in companionFiles
                            where companion == file + companionExtension
                            select file;

如果目录相当大,那么下面的内容可能会更加优化

var companionQuery = companionFiles.Select(file => file.Replace(Path.GetExtension(file), ""));
var companionSet = new HashSet<string>(companionQuery);
var filesWithCompanions = mainFiles.Where(companionSet.Contains);

答案 3 :(得分:0)

var ext = ".xml";
FileInfo[] files = ...
var filered = files.Where(fi=> fi.Name.EndsWith(ext)).ToList();
// filtered is an List<FileInfo>

但是,您可能不需要ToList()(或过滤器变量)

var ext = ".xml";
FileInfo[] files = ...
foreach(var file in files.Where(fi=> fi.Name.EndsWith(ext))
{ 
     // do something with "file" here
}