C# 谓词帮助<;T>;代表
我试图创建一个重载的Add方法作为OrderedDictionary类的扩展,并希望基于一些curried谓词添加键/值 调用代码如下所示:C# 谓词帮助<;T>;代表,c#,functional-programming,predicate,C#,Functional Programming,Predicate,我试图创建一个重载的Add方法作为OrderedDictionary类的扩展,并希望基于一些curried谓词添加键/值 调用代码如下所示: OrderedDictionary dict = new OrderedDictionary(); Predicate<int> lessThan5 = i=>; i < 5; Predicate<string> lenOf2 = s=> s.length == 2; dict.Add("01","Name", lessThan5
OrderedDictionary dict = new OrderedDictionary();
Predicate<int> lessThan5 = i=>; i < 5;
Predicate<string> lenOf2 = s=> s.length == 2;
dict.Add("01","Name", lessThan5 );
dict.Add("02","place", lenOf2);
但它不起作用,因为我得到一个编译器错误,读取“不能将谓词转换为bool”
有人知道我错过了什么吗
谢谢你的帮助。
-Keith问题在于,您没有评估谓词以检查谓词是否满足。现在,您的问题不清楚您是否希望谓词测试键或值。下面的代码检查密钥。您还应该考虑方法返回<代码>布尔O/COM>指示成功或失败,正如我在这里所做的。
static class OrderedDictionaryExtensions {
public static bool Add(
this OrderedDictionary dictionary,
string key,
string value,
Predicate<string> predicate
) {
if (dictionary == null) {
throw new ArgumentNullException("dictionary");
}
if (predicate == null) {
throw new ArgumentNullException("predicate");
}
if (predicate(key)) {
dictionary.Add(key, value);
return true;
}
return false;
}
}
用法:
// dictionary is OrderedDictionary
dictionary.Add(17, "Hello, world!", i => i % 2 != 0);
+1不过,通过直接说明OP代码的错误可以改进好的示例:
如果
接受bool,那么不要传递任何其他内容。谓词应该有一个类型参数。必须显式调用委托(并传递任何必需的参数)才能执行委托-正如您所说,我们应该测试键还是值?如果我们说不出来,编译器怎么可能呢?谢谢,杰森。我不熟悉函数式编程的概念,所以如果我不清楚,请原谅我。谓词值应该与键或值参数无关。我想让谓词函数转换一个值。我想这样做:Predicate showPlaces=newpredicate(u=>u.isAllowed);Preicate showPeople=新谓词(i=>i==5);然后将showPlaces或showPeople谓词作为参数传递给一个方法,该方法将在不传递任何参数的情况下对其求值。。。如果(p)d添加(k,v)@未知(google):谓词是将某些集合映射到{true,false}
的函数。谓词没有真值;通过在其域的某个成员处对其进行评估,可以从中获得真值。因此,当您说Predicate p=new Predicate(i=>i==5)
时,您必须注意p
没有真值。如果你想从p
中得到一个真值,你必须在int
处对它求值。现在,要使函数有效地保持一个参数不变。因此,对于一个只有一个参数开始的谓词,这意味着将谓词减少为单个值true
或false
。所以,如果这就是你想要的,为什么不让你上面的方法接受一个bool
?但是,在这种情况下,你为什么还要调用这个方法呢?如果bool
为false,不要麻烦调用Add
,否则请调用Add
。谓词值应该与键或值参数无关。我想让谓词函数转换一个值。类似这样:谓词showPlaces=新谓词(u=>u.isAllowed);谓词showPeople=新谓词(i=>i==5);然后将showPlaces或showPeople谓词作为参数传递给方法,该方法将在不传递任何参数的情况下对其求值。如果(p)d添加(k,v);“转换值的谓词”如何不仅仅是布尔值?你能解释一下吗?你说得对,埃里克。也许我想得太多了。
// dictionary is OrderedDictionary
dictionary.Add("key", "value", s => s.Length < 5);
static class OrderedDictionaryExtensions {
public static bool Add<TKey, TValue>(
this OrderedDictionary dictionary,
TKey key,
TValue value,
Predicate<TKey> predicate
) {
if (dictionary == null) {
throw new ArgumentNullException("dictionary");
}
if (predicate == null) {
throw new ArgumentNullException("predicate");
}
if (predicate(key)) {
dictionary.Add(key, value);
return true;
}
return false;
}
}
// dictionary is OrderedDictionary
dictionary.Add(17, "Hello, world!", i => i % 2 != 0);