Используя С# GetFiles Length, но подсчитывайте только файлы с определенным количеством символов в имени файла

Поэтому я использую простой

ImgFilesCount = ImgDirInfo.GetFiles("*.jpg").Length;

чтобы выяснить, сколько файлов находится в каталоге. Но мне нужно, чтобы он подсчитывал только файлы, в имени которых ровно 26 символов. Я старался

ImgFilesCount = ImgDirInfo.GetFiles("?????????????????????????.jpg").Length;

Но это не сработало. Является ли единственным вариантом выполнить цикл foreach и проверить каждое имя файла и увеличить счетчик? У меня есть ощущение, что linq, вероятно, может сделать это с помощью оператора .Where, но я не знаю ни одного Linq.


person Matt Winer    schedule 17.05.2013    source источник
comment
.Where(fname =› условие(fname.Length))   -  person Lennart    schedule 18.05.2013


Ответы (2)


Может быть

int count = ImgDirInfo.EnumerateFiles("*.jpg").Count(f => f.Name.Length == 26);

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

  • При использовании EnumerateFiles можно начать перечисление коллекции объектов FileInfo до того, как вся коллекция будет возвращена.
  • При использовании GetFiles необходимо дождаться возврата всего массива объектов FileInfo, прежде чем вы сможете получить к нему доступ.
person Tim Schmelter    schedule 17.05.2013
comment
Хорошая мысль о EnumerateFiles. Небольшое примечание: разве Count не будет загружать все файлы, делая потоковую передачу EnumerateFiles неактуальной? - person Ilya Ivanov; 18.05.2013
comment
@IlyaIvanov Ну нет. В этом вся прелесть итераторов. Метод расширения Count использует запрос в процессе подсчета. - person SimpleVar; 18.05.2013
comment
@YoryeNathan в результате делает больше звонков на жесткий диск? - person Ilya Ivanov; 18.05.2013
comment
@YoryeNathan: В этом случае Илья прав, поскольку Count нужно перечислить все файлы с заданным шаблоном поиска. Так что в целом лучше использовать Directory.EnumerateFiles, если вам нужно только имя файла. - person Tim Schmelter; 18.05.2013
comment
@IlyaIvanov Производительность против памяти. Я обычно иду на выступление, но это зависит от ситуации. Это только для того, чтобы указать, что в некоторых случаях метод EnumerateFiles является более подходящим, хотя он действительно использует запрос в конце. - person SimpleVar; 18.05.2013
comment
@YoryeNathan согласен, но трудно сказать, где производительность лучше, без эмпирических данных. В любом случае, мне обязательно нужно помнить EnumerateFiles. Я знал о ReadLines против ReadAllLines, теперь Тим принес другое потоковое и непотоковое чтение файлов, - person Ilya Ivanov; 18.05.2013

Что-то вроде этого?

        string[] files = Directory
                         .EnumerateFiles(@"c:\Users\x074\Downloads" , "*.jpg" , SearchOption.AllDirectories )
                         .Where( path => Path.GetFileName(path).Length > 20 )
                         .ToArray()
                         ;
person Nicholas Carey    schedule 18.05.2013
comment
ровно 26 символов несколько отличается от Length > 20. - person Tim Schmelter; 18.05.2013