C# 从列表中删除项目<;字符串>;存在于CheckedListBox项的子字符串中的
在WinForms应用程序中,我有一个CheckedListBox(lst_文件)和一个类型为List的变量文件,其中填充了文本文件的简单路径。例如,我将只使用文件中的一项C# 从列表中删除项目<;字符串>;存在于CheckedListBox项的子字符串中的,c#,list,winforms,linq,checkedlistbox,C#,List,Winforms,Linq,Checkedlistbox,在WinForms应用程序中,我有一个CheckedListBox(lst_文件)和一个类型为List的变量文件,其中填充了文本文件的简单路径。例如,我将只使用文件中的一项 List<string> files = new List<string>() { "C:\\migration\\TestFiles\\New Text Document.txt" }; 如果文件在删除“重复项”后仍有项,我将填充lst_文件 lst_files.Items.AddRange(fi
List<string> files = new List<string>() { "C:\\migration\\TestFiles\\New Text Document.txt" };
如果文件在删除“重复项”后仍有项,我将填充lst_文件
lst_files.Items.AddRange(files.ToArray());
到目前为止,所有这些都有效
现在,由于需要过滤器,我添加了一个枚举nist_类型
internal enum nist_type
{
add = 0
,
update = 1
,
delete = 2
}
枚举的目的是确定需要从每个单独的文本文件中提取哪些记录类型。现在,当我填充lst_文件时,我会
lst_files.Items.AddRange
(
files
.Select(s => "[" + String.Join("][", criteria.nist_types) + "] " + s)
.ToArray()
);
在lst_文件中,结果为(如果选择了所有三个文件管理器)
lst_文件中的输出结果是完美的,没有问题还要注意,文件的前缀可以是[add][update][delete]的任意组合;它可以是三个中的一个、任意两个或全部三个。
由于[add][update][delete]前缀,我遇到的问题是检查文件,该项是否已存在于lst_文件中。我尝试过各种方法,但似乎无法破解这一方法。在这里,我尝试删除以文件中的项结尾的项,但这也不起作用
files.RemoveAll(x => lst_files.Items.Contains(lst_files.Items.Cast<string>().Where(s => s.EndsWith(x))));
files.RemoveAll(x=>lst_文件.Items.Contains(lst_文件.Items.Cast().Where(s=>s.EndsWith(x)));
我知道我可以在for循环中完成这项工作,这将非常简单,但我更愿意用更优雅的LINQ方式来完成,并学习一些新的东西
任何帮助都将不胜感激。我正在尝试,它的工作很好:
files.RemoveAll(x => lst_files.Items.Cast<string>().Any(s => s.EndsWith(x)));
files.RemoveAll(x=>lst_files.Items.Cast().Any(s=>s.EndsWith(x));
对于测试,我使用了:
内部枚举类型
{
相加=0,
更新=1,
删除=2
}
List files=new List(){“C:\\migration\\TestFiles\\new Text Document.txt”};
string[]lst_files=files.Select(s=>“[”+string.Join(“][”,新列表{nist_type.add,nist_type.update})+“]”+s.ToArray();
files.RemoveAll(x=>lst_files.Any(s=>s.EndsWith(x));
我希望这将帮助您解决问题。我正在尝试此方法,效果很好:
files.RemoveAll(x => lst_files.Items.Cast<string>().Any(s => s.EndsWith(x)));
files.RemoveAll(x=>lst_files.Items.Cast().Any(s=>s.EndsWith(x));
对于测试,我使用了:
内部枚举类型
{
相加=0,
更新=1,
删除=2
}
List files=new List(){“C:\\migration\\TestFiles\\new Text Document.txt”};
string[]lst_files=files.Select(s=>“[”+string.Join(“][”,新列表{nist_type.add,nist_type.update})+“]”+s.ToArray();
files.RemoveAll(x=>lst_files.Any(s=>s.EndsWith(x));
我希望这能帮助您解决问题。谢谢您的意见,但这对我正在尝试的工作不起作用。lst_文件是一个CheckListBox,而不是字符串数组,CheckedListBox项不包含Any()的定义。必须从lst_文件项创建一个数组无法达到目的,那么我不妨采用for循环方式,这正是我试图避免的。首先尝试
Cast
,并使用我的建议:IEnumerable lst_fileList=lst_files.items.Cast();files.RemoveAll(x=>lst_fileList.Any(s=>s.EndsWith(x))代码>喜欢我的更新。对于代码,您尝试检查ObjectCollection
是否包含string
将始终给出false
。。。我刚要发帖,就看到了你的评论。我更改了您的第二行代码并添加了一个cast,然后它就完美地工作了。我使用了files.RemoveAll(x=>lst_files.Items.Cast().Any(s=>s.EndsWith(x));如果你更新你的答案,我会把它标记为接受。再次感谢你的帮助。感谢你的投入,但这对我正在尝试的工作不起作用。lst_文件是一个CheckListBox,而不是字符串数组,CheckedListBox项不包含Any()的定义。必须从lst_文件项创建一个数组无法达到目的,那么我不妨采用for循环方式,这正是我试图避免的。首先尝试Cast
,并使用我的建议:IEnumerable lst_fileList=lst_files.items.Cast();files.RemoveAll(x=>lst_fileList.Any(s=>s.EndsWith(x))代码>喜欢我的更新。对于代码,您尝试检查ObjectCollection
是否包含string
将始终给出false
。。。我刚要发帖,就看到了你的评论。我更改了您的第二行代码并添加了一个cast,然后它就完美地工作了。我使用了files.RemoveAll(x=>lst_files.Items.Cast().Any(s=>s.EndsWith(x));如果你更新你的答案,我会把它标记为接受。再次感谢你的帮助。
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)));