Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从列表中删除项目<;字符串>;存在于CheckedListBox项的子字符串中的_C#_List_Winforms_Linq_Checkedlistbox - Fatal编程技术网

C# 从列表中删除项目<;字符串>;存在于CheckedListBox项的子字符串中的

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

在WinForms应用程序中,我有一个CheckedListBox(lst_文件)和一个类型为List的变量文件,其中填充了文本文件的简单路径。例如,我将只使用文件中的一项

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