从 List<string> 中删除存在于 CheckedListBox 项的子字符串中的项

Remove items from List<string> that exist in Substring of CheckedListBox items

在 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));

如果删除 "duplicates" 后文件仍有项目,我将填充 lst_files

lst_files.Items.AddRange(files.ToArray());

到此为止一切正常。

现在,由于需要过滤器,我添加了一个 Enum nist_type

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

枚举的目的是确定我需要从每个单独的文本文件中提取哪些记录类型。所以现在,当我填充 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中的输出结果是完美的,没有错。 还要注意,文件的前缀可以是[add][update][delete]的任意组合;它可以是三个之一,任何两个,或全部三个。

我遇到的问题是检查文件,项目是否已经存在于 lst_files 中,因为 [add][update][delete] 前缀。我尝试了各种方法,但似乎无法破解这一方法。在这里,我尝试删除以文件中的项目结尾的项目,但这也不起作用

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

我知道我可以在 for 循环中完成它,这会很容易,但我更愿意以更优雅的 LINQ 方式完成它并学习一些新东西。

如有任何帮助,我们将不胜感激。

我正在尝试这个,它工作正常:

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

For test, i used :

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)));

希望这能帮助您解决问题。