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