Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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# 如何从列表中排除项目<;RegistryPathData>;_C# - Fatal编程技术网

C# 如何从列表中排除项目<;RegistryPathData>;

C# 如何从列表中排除项目<;RegistryPathData>;,c#,C#,我有一个字符串数组和一个列表,数据如下所示 string[] str = new string[2] { "Prod1", "Prod2" }; List<RegistryPathData> data = new List<RegistryPathData> { new RegistryPathData{AppName="test1", RegPath="Prod1|Version"}, ne

我有一个字符串数组和一个列表,数据如下所示

string[] str = new string[2] { "Prod1", "Prod2" };
        List<RegistryPathData> data = new List<RegistryPathData>
        {
            new RegistryPathData{AppName="test1", RegPath="Prod1|Version"},
            new RegistryPathData{AppName="test2", RegPath="Prod2|Version"},
            new RegistryPathData{AppName="test3", RegPath="Prod3|Version"},
            new RegistryPathData{AppName="test4", RegPath="Prod4|Version"},
            new RegistryPathData{AppName="test5", RegPath="Prod5|Version"},
        };
像这样使用
List.RemoveAll()
函数


data.RemoveAll(d=>str.Contains(d.RegPath.Split(“|”)[0])

您可以使用LINQ
.Where()
方法根据谓词筛选值序列

data.Where(d => !str.Contains(d.RegPath.Split('|')[0]));

这意味着过滤掉列表中第一个管道字符之前的字符串未包含在
str
数组中的项目。

使用LINQ中的
where
方法,然后检查
str
数组中的任何字符串是否与当前对象的
RegPath
匹配。像这样:

List<RegistryPathData> dataOnlyProd1And2 = data
    .Where(rpd => str.Any(s => rpd.RegPath.StartsWith(s)))
    .ToList();
List dataonlyprod1和2=数据
.Where(rpd=>str.Any(s=>rpd.RegPath.StartsWith(s)))
.ToList();

虽然这会起作用,但它会不必要地创建一个新列表,而您可以通过
RemoveAll()
轻松地修改现有列表。如果您想实现这一点,可以重新分配给同一个变量。以后使用LINQ方法有很多优点,我更喜欢在任何可能的时候使用它们。你听起来好像根本不知道自己在说什么
ToList()
将分配一个新的
列表
。它确实会分配一个新列表(具有相同的对象),同时会丢弃以前的列表。我完全知道我在说什么。这会返回一个
int
?不要回忆返回类型,我认为它会返回删除的项目数。我将不得不在MSDN中查找或在VS中搜索我们自己可能使用过它的位置。啊,是的-我道歉<代码>数据之后只有3个值。我没有否决你的答案,但也许下次尝试解释你答案中的代码的作用。这对你来说似乎是不言自明的,但对OP来说可能并非如此。@GregaMohorko谢谢你的反馈。我已经更新了我的答案,以备将来参考。
List<RegistryPathData> dataOnlyProd1And2 = data
    .Where(rpd => str.Any(s => rpd.RegPath.StartsWith(s)))
    .ToList();