【问题标题】:Remove items from List<string> that exist in Substring of CheckedListBox items从 List<string> 中删除 CheckedListBox 项的子字符串中存在的项
【发布时间】:2020-03-12 08:24:55
【问题描述】:

在 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
}

枚举的目的是确定我需要从每个单独的文本文件中提取哪些记录类型。所以现在,当我填充 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]的任意组合;它可以是三个之一、任意两个或三个全部。

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

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

我知道我可以在 for 循环中做到这一点,这很容易,但我更愿意使用更优雅的 LINQ 方式并学习新的东西。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# list winforms linq checkedlistbox


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的意见,但它不适用于我正在尝试做的事情。 lst_files 是一个 CheckListBox,而不是字符串数组,并且 CheckedListBox 项不包含 Any() 的定义。必须从 lst_files 项目创建一个数组违背了目的,那么我不妨采用 for 循环方式,这是我试图避免的。
    • 首先尝试Cast,并使用我的建议:IEnumerable&lt;string&gt; lst_fileList = lst_files.Items.Cast&lt;string&gt;(); files.RemoveAll(x =&gt; lst_fileList.Any(s =&gt; s.EndsWith(x))); 喜欢我的更新。对于您的代码,您尝试检查ObjectCollection 是否包含string 将始终给出false
    • 但是...当我看到您的评论时,我正要发帖。我更改了您的第二行代码并添加了演员表,然后它就可以完美运行了。我使用了 files.RemoveAll(x => lst_files.Items.Cast().Any(s => s.EndsWith(x)));如果您更新答案,我会将其标记为已接受。再次感谢您的帮助。
    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    相关资源
    最近更新 更多