【发布时间】: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