在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方式来做到这一点并学到一些新知识。
任何帮助将不胜感激。
在WinForms应用程序中,我有一个CheckedListBox(lst_files),以及一个类型为List的变量文件,其中填充了文本文件的简单路径。出于示例目的,我将仅在...
我正在尝试,效果很好: