我正在尝试创建一个重载的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 );
dict.Add("02","place", lenOf2);
我创建了一个类似的扩展方法:
public static class CollectionExtensions
{
public static void Add(this OrderedDictionary s, string k, string v, Predicate p)
{
if (p)
{
d.Add(k, v);
}
}
}
但是它不起作用,因为我得到一个编译器错误,读取“无法将谓词转换为bool”。
有谁知道我错过了什么?
感谢您的帮助。 -Keith
答案 0 :(得分:3)
问题在于您没有评估谓词以检查谓词是否满足。现在,从您的问题中不清楚您是否希望谓词测试密钥或值。以下检查密钥。您还应该考虑让方法返回bool
表示成功或失败,就像我在这里所做的那样。
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("key", "value", s => s.Length < 5);
由于OrderedDictionary
不是强类型的,因此您可以对此进行一般性概括。
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);