В приложении WinForms у меня есть CheckedListBox (lst_files) и переменные файлы типа List, которые заполняются простыми путями текстовых файлов. Например, я буду использовать только один элемент в файлах
List<string> files = new List<string>() { "C:\\migration\\TestFiles\\New Text Document.txt" };
Прежде чем заполнить lst_files, я удаляю все элементы из файлов, которые уже существуют в lst_files, выполнив
files.RemoveAll(x => lst_files.Items.Contains(x));
Если В файлах все еще есть элементы после удаления «дубликатов», я заполняю lst_files
lst_files.Items.AddRange(files.ToArray());
Это все работает до этого момента.
Теперь, из-за необходимости фильтров, я добавил Enum nist_type
internal enum nist_type
{
add = 0
,
update = 1
,
delete = 2
}
Цель Enum - определить, какие типы записей мне нужно извлечь из каждого отдельного текстового файла. Так что теперь, когда я заполняю lst_files, я делаю
lst_files.Items.AddRange
(
files
.Select(s => "[" + String.Join("][", criteria.nist_types) + "] " + s)
.ToArray()
);
В lst_files это приводит к (если были выбраны все три файла)
[add][update][delete] C:\migration\TestFiles\New Text Document.txt
Результат вывода в lst_files идеален, ничего плохого в этом нет. Также обратите внимание, что префикс к файлам может быть любой комбинацией [добавить] [обновить] [удалить]; это может быть один из трех, любых двух или всех трех.
Проблема, с которой я сталкиваюсь, заключается в проверке файлов, существует ли элемент в lst_files из-за [add] [update] [удалить] префикс. Я пробовал разные подходы, но не могу взломать этот. Здесь я попытался удалить элементы, если они заканчиваются на элементе в файлах, но это тоже не работает
files.RemoveAll(x => lst_files.Items.Contains(lst_files.Items.Cast<string>().Where(s => s.EndsWith(x))));
Я знаю, что могу сделать это в течение l oop, что было бы довольно легко , но я бы предпочел сделать это более элегантным способом LINQ и узнать что-то новое.
Любая помощь будет оценена.