linq для извлечения определенного подмножества - PullRequest
1 голос
/ 25 августа 2011

Учитывая каталог файлов (в виде массива FileInfo), как мне извлечь все имена файлов, которые имеют соответствующее имя файла с конкретным расширением.

Например, задан каталог следующих файлов;

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

Как мне извлечь file1.txt, file2.txt и file3.xml. По сути, я ищу любой файл, который имеет запись с соответствующим заданным расширением (в данном случае xml).

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 25 августа 2011

Этот код создаст список соответствующих файлов (при условии, что файлы являются 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 голос
/ 25 августа 2011

Решение Джеймса работает.Вы также можете использовать

files.Where(fi => fi.Extension == ext).ToList();
1 голос
/ 25 августа 2011

Вы можете пойти с чем-то вроде

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);
0 голосов
/ 25 августа 2011
var ext = ".xml";
FileInfo[] files = ...
var filered = files.Where(fi=> fi.Name.EndsWith(ext)).ToList();
// filtered is an List<FileInfo>

Однако вам, вероятно, не нужен ToList () (или переменная filters)

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