Поиск определенного символа в позиции в списке

Я новичок в C # и работаю над проектом, в котором мне нужно искать в каталоге определенные типы документов и записывать их имена. Затем с этими именами документов мне нужно проверить, что все они начинаются с идентификатора в форме xxxx-xxxx-xxxxxx-xxx-xxx и сохранить только те, которые оба этих утверждения верны.

Я использую:

            var filesToBeRead = Directory.GetFiles(FBD.SelectedPath, "*.*", SearchOption.AllDirectories)  
            .Where(s => s.EndsWith(".txt") || s.EndsWith(".docx") || s.EndsWith(".doc")|| s.EndsWith(".xls") || s.EndsWith(".docm") || s.EndsWith(".xlsm") || s.EndsWith(".xlsx")); 

Чтобы получить все файлы в моем указанном каталоге и сохранить их в строке IEnumerable. Затем я копирую это в список, потому что думаю, что списком будет легче манипулировать. (Я не уверен, что они на самом деле одно и то же, и я делаю дополнительную работу для себя).

            var allFiles = new List<string>();
            allFiles = filesToBeRead.ToList();

Тогда я не совсем уверен, что делать. Моя идея такова: поскольку xxxx-xxxx-xxxxxx-xxx-xxx - это формат, который я ищу в начале каждого имени документа, и это 24 символа длиной, я бы поискал 25-й символ и скопировал все в строке перед что. Я не совсем уверен, как это сделать, и, в частности, я не уверен, как перебирать список и каждый раз его копировать.

Моя идея состоит в том, чтобы использовать foreach, но я не знаю, как указать, что я ищу 25-й символ, и скопировать все до этого.

Мы будем очень благодарны за любую помощь или направление на веб-страницу, чтобы узнать, как это сделать.

Всего 2 ответа


Этот запрос linq получает List всех файлов, которые заканчиваются этими расширениями и имеют 25-й char, равный x. Вы можете изменить charToSearch, чтобы найти только тот файл, который вам нужен

var charToSearch = 'x'
var filesToBeRead = Directory.GetFiles(FBD.SelectedPath, "*.*", SearchOption.AllDirectories)
                                 .Where(s => (s.EndsWith(".txt") || s.EndsWith(".docx") || s.EndsWith(".doc") || s.EndsWith(".xls") ||
                                 s.EndsWith(".docm") || s.EndsWith(".xlsm") || s.EndsWith(".xlsx"))
                                 && s[25] == charToSearch) .ToList();

Я не уверен, что это одно и то же, и делаю дополнительную работу для себя

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

var allFiles = new List<string>();
allFiles = filesToBeRead.ToList();

Объект, возвращаемый new List<string>(), никогда не используется, поскольку указатель на него (allFiles) немедленно перезаписывается результатом filesToBeRead.ToList(). Вы могли бы использовать .ToList() в конце исходного оператора, если хотите, чтобы результаты были List<T>:

var filesToBeRead = 
   Directory.GetFiles(FBD.SelectedPath, "*.*", SearchOption.AllDirectories)  
            .Where(s => s.EndsWith(".txt") 
                        || s.EndsWith(".docx")
                        || s.EndsWith(".doc")
                        || s.EndsWith(".xls")
                        || s.EndsWith(".docm")
                        || s.EndsWith(".xlsm")
                        || s.EndsWith(".xlsx"))
            .ToList();

Что касается того, как узнать, соответствуют ли имена файлов вашему шаблону, " соответствуют вашему шаблону " это ключ. Для меня желаемый шаблон выглядит как Guid, поэтому, если вы используете Path.GetFilenameWithoutExtension() для получения имени файла, а затем используете Regex, чтобы увидеть, соответствует ли он шаблону Guid, вы, вероятно, будете отсортированы.


Есть идеи?

10000