如何使用使用列表<T>。全部删除以简化循环并从集合中删除项目



我下面有这个实现。它使用for循环。有没有一种方法可以消除for循环并使用C#列表扩展简化代码?

public class Member
{
public string member { get; set; }
}
public class PatternMatch
{
public static List<Member> Remove()
{
var prefix = new string[] { "usa-", "o-", "a-" };
var members = new List<Member>();
members.Add(new Member { member = "a-o@b.com" });
members.Add(new Member { member = "usa-b@d.com" });
members.Add(new Member { member = "c@d.com" });
// don't use foreach since we will be modifying the collection 
for (var i = members.Count - 1; i >= 0; i--)
{
foreach (var pattern in prefix)
{
if (members[i].member.StartsWith(pattern, StringComparison.InvariantCultureIgnoreCase))
{
members.RemoveAt(i);
}
}
}
return members;
}
}

RemoveAll实现可能看起来像这个

members.RemoveAll(x => prefix.Any(p => x.member.StartsWith(p, StringComparison.InvariantCultureIgnoreCase)))

CCD_ 2删除与给定CCD_ 3匹配的所有项目。

Predicate<T>基本上是一个参数为T、返回类型为bool的方法。

因此,上面的代码可以重写为

members.RemoveAll(ConditionToRemove);
bool ConditionToRemove(Member x) => true;

条件

x => prefix.Any(p => x.member.StartsWith(p, StringComparison.InvariantCultureIgnoreCase))

是否执行以下

对于每个T-我将其声明为变量x-它将检查列表prefix中是否有条件为的Any条目

x.member.StartsWith(p, StringComparison.InvariantCultureIgnoreCase)

因此,如果至少有一个条目x.member以开头,则prefix.Any将返回true

使用Linq,类似这样的东西会起作用:

return members
.Where(m => !prefix
.Any(p  => m.member.StartsWith(p, StringComparison.InvariantCultureIgnoreCase)))
.ToList();

最新更新