我下面有这个实现。它使用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();