我有一个字典,我想根据不同的条件进行过滤,例如
IDictionary<string, string> result = collection.Where(r => r.Value == null).ToDictionary(r => r.Key, r => r.Value);
我想将Where子句作为参数传递给执行实际过滤的方法,例如
private static IDictionary<T1, T2> Filter<T1, T2>(Func<IDictionary<T1, T2>, IDictionary<T1, T2>> exp, IDictionary<T1, T2> col)
{
return col.Where(exp).ToDictionary<T1, T2>(r => r.Key, r => r.Value);
}
但这不会编译。
我尝试使用
调用此方法Func<IDictionary<string, string>, IDictionary<string, string>> expression = r => r.Value == null;
var result = Filter<string, string>(expression, collection);
我做错了什么?
答案 0 :(得分:7)
Where
想要一个Func<TSource, bool>
,在您的情况下Func<KeyValuePair<TKey, TValue>, bool>
。
此外,您返回的方法类型不正确。它应该使用T1
和T2
而不是string
。此外,最好为通用参数使用描述性名称。我使用了与字典相同的名称 - T1
和T2
,而不是TKey
和TValue
:
private static IDictionary<TKey, TValue> Filter<TKey, TValue>(
Func<KeyValuePair<TKey, TValue>, bool> exp, IDictionary<TKey, TValue> col)
{
return col.Where(exp).ToDictionary(r => r.Key, r => r.Value);
}
答案 1 :(得分:0)
如果你看一下Where
扩展方法的构造函数,你会看到
Func<KeyValuePair<string, string>, bool>
所以这就是你需要过滤的,试试这个扩展方法。
public static class Extensions
{
public static IDictionairy<TKey, TValue> Filter<TKey, TValue>(this IDictionary<TKey, TValue> source, Func<KeyValuePair<TKey, TValue>, bool> filterDelegate)
{
return source.Where(filterDelegate).ToDictionary(x => x.Key, x => x.Value);
}
}
呼叫
IDictionary<string, string> dictionairy = new Dictionary<string, string>();
var result = dictionairy.Filter((x => x.Key == "YourValue"));