c# .NET 2.0 有什么办法吗?组合多个谓词?
假设我有以下代码。
List<string> names = new List<string>();
names.Add("Jacob");
names.Add("Emma");
names.Add("Michael");
names.Add("Isabella");
names.Add("Ethan");
names.Add("Emily");
List<string> filteredNames = names.FindAll(StartsWithE);
static bool StartsWithE(string s)
{
if (s.StartsWith("E"))
{
return true;
}
else
{
return false;
}
}
这给了我:
Emma
Ethan
Emily
所以这是非常酷的东西,但我知道希望能够使用多个谓词进行过滤。
所以我希望能够这样说:
List<string> filteredNames = names.FindAll(StartsWithE OR StartsWithI);
为了得到:
Emma
Isabella
Ethan
Emily
我怎样才能实现这个目标?
目前,我只是将完整列表过滤两次,然后合并结果。但不幸的是,这是非常低效的,更重要的是我丢失了原始的排序顺序,这在我的情况下是不可接受的。
我还需要能够迭代任意数量的过滤器/谓词,因为可能有很多。
同样,它需要是 .NET 2.0 解决方案,不幸的是我无法使用该框架的较新版本
多谢。
怎么样:
public static Predicate<T> Or<T>(params Predicate<T>[] predicates)
{
return delegate (T item)
{
foreach (Predicate<T> predicate in predicates)
{
if (predicate(item))
{
return true;
}
}
return false;
};
}
为了完整性:
public static Predicate<T> And<T>(params Predicate<T>[] predicates)
{
return delegate (T item)
{
foreach (Predicate<T> predicate in predicates)
{
if (!predicate(item))
{
return false;
}
}
return true;
};
}
然后用以下方式调用它:
List<string> filteredNames = names.FindAll(Helpers.Or(StartsWithE, StartsWithI));
另一种选择是使用多播委托,然后使用GetInvocationList()
,然后做同样的事情。然后你可以这样做:
List<string> filteredNames = names.FindAll(Helpers.Or(StartsWithE+StartsWithI));
不过,我不太喜欢后一种方法——感觉有点滥用多播。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)