C# 委托组合不当行为

C# 委托组合不当行为,c#,delegates,C#,Delegates,给出以下代码: List<string> aux = new List<string>(); aux.Add("a"); aux.Add("ab"); aux.Add("ac"); aux.Add("abc"); aux.Add("b"); aux.Add("bc"); aux.Add("c"); aux.Add("e"); aux.Add("f"); Func<string, bool> searchForA = (f => f.Contains(

给出以下代码:

List<string> aux = new List<string>();

aux.Add("a");
aux.Add("ab");
aux.Add("ac");
aux.Add("abc");
aux.Add("b");
aux.Add("bc");
aux.Add("c");
aux.Add("e");
aux.Add("f");

Func<string, bool> searchForA = (f => f.Contains("a"));
Func<string, bool> searchForC = (f => f.Contains("c"));
Func<string, bool> searchForF = (f => f.Contains("f"));
返回“ac”、“abc”、“bc”和“c”,其结果与

aux.Where(searchForC).ToList();
我的意思是,第一个问题的“a”和“ab”和“F”在哪里

编辑:我使用委托组合是因为我想动态定义搜索模式

EDIT2:主要编辑检查新的示例代码,这是我试图解决的问题

string[] searchFor = "a c f".Split(' ');

Func<string, bool>[] delegates = new Func<string, bool>[searchFor.Length];
for (int i = 0; i < searchFor.Length; i++)
{
    string search = searchFor[i]; // Make sure the lambda does not capture a loop variable!
    delegates[i] = new Func<string, bool>(f => f.Contains(search));
}

List<string> aux = new List<string>(); 
aux.Add("a");
aux.Add("ab");
aux.Add("ac");
aux.Add("abc");
aux.Add("b");
aux.Add("bc");
aux.Add("c");
aux.Add("e");
aux.Add("f");

List<string> result = aux.Where((Func<string, bool>)Delegate.Combine(delegates)).ToList();
string[]searchFor=“a c f”.Split(“”);
Func[]委托=新Func[searchFor.Length];
for(int i=0;if.Contains(搜索));
}
List aux=新列表();
附加条款添加(“a”);
增补(“ab”);
补充说明(“ac”);
补充说明(“abc”);
增补(“b”);
增补(“bc”);
补充补充(“c”);
补充补充(“e”);
增补(“f”);
列表结果=aux.Where((Func)Delegate.Combine(delegates)).ToList();

调用两个非void返回委托的组合具有语义“调用第一个,放弃结果,调用第二个,返回结果”。它没有语义“同时调用它们和
或者如果它们恰好返回
bool
”。记住,委托组合必须适用于任何委托类型;为什么运行库应该为bool返回的委托选择
语义,而不是
语义?对于返回
字符串
并连接字符串的代理,它应该做什么?如果您将
int
返回的代理组合在一起,它是否应该添加数字

合并结果的问题无法以一致的方式解决,因此选择忽略所有结果,但最后一个结果除外

如果您想将两个谓词
组合在一起,那么您可以自己轻松地完成。下面是一个方便的扩展方法:

static Func<T, bool> Or<T>(this Func<T, bool> f1, Func<T, bool> f2)
{ return t => f1(t) || f2(t); }
您还可以将其扩展到多个代理:

static Func<T, bool> OrMany<T>(params Func<T, bool>[] fs)
{ 
    Func<T, bool> result = t => false;
    foreach(Func<T, bool> f in fs)
        result = result.Or(f);
    return result;
}
...Where(OrMany(searchForA, searchForC, searchForf))...
Func<string, bool>[] delegates = whatever;
...Where(OrMany(delegates))...
或“未展开表单”,包含一组委托:

static Func<T, bool> OrMany<T>(params Func<T, bool>[] fs)
{ 
    Func<T, bool> result = t => false;
    foreach(Func<T, bool> f in fs)
        result = result.Or(f);
    return result;
}
...Where(OrMany(searchForA, searchForC, searchForf))...
Func<string, bool>[] delegates = whatever;
...Where(OrMany(delegates))...
Func[]delegates=无论什么;
…其中(或任何(代表))。。。

我不知道
+
对学员有什么作用,但您应该使用
|
&&
@HighCore逻辑运算符“和”和“或”对学员无效delegates@Leonardo你说得对。然后应该是
。其中(x=>SearchForA(x)| | searchForC(x))
您新添加的代码有一个“访问修改的闭包”错误。每个代理在同一变量
i
上关闭,因此当代理运行时,
i
将超出范围。我会修改你的密码。杜普:谢谢!你几乎理解了我最初的问题。。。问题是,我想使用2个以上的代理进行搜索。。。我进一步编辑了这本书question@Leonardo:您可以使用我提供的
帮助程序组合任意数量的代理。我进一步编辑了这些代理,但您似乎已经用OrMany解决了这些问题。。。病态it@Leonardo:我修复了你代码中的一个错误。您可以使用我的
OrMany
方法组合您的代理数组。您刚刚获得了另一个风扇!太多了!