Удалить элементы из списка <string>, которые существуют в подстроке элементов CheckedListBox - PullRequest
0 голосов
/ 12 марта 2020

В приложении 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 и узнать что-то новое.

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 12 марта 2020

Я пытаюсь, все работает нормально:

files.RemoveAll(x => lst_files.Items.Cast<string>().Any(s => s.EndsWith(x)));

Для теста я использовал:

internal enum nist_type
{
    add = 0,
    update = 1,
    delete = 2
}

List<string> files = new List<string>() { "C:\\migration\\TestFiles\\New Text Document.txt" };
string[] lst_files = files.Select(s => "[" + String.Join("][", new List<nist_type> { nist_type.add, nist_type.update }) + "] " + s).ToArray();

files.RemoveAll(x => lst_files.Any(s => s.EndsWith(x)));

Надеюсь, это поможет вам исправить вопрос.

...