如何在委托中使用Dictionary

Rot*_*te2 4 c# delegates dictionary

我有一个字典,我想根据不同的条件进行过滤,例如

IDictionary<string, string> result = collection.Where(r => r.Value == null).ToDictionary(r => r.Key, r => r.Value);
Run Code Online (Sandbox Code Playgroud)

我想将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);
}
Run Code Online (Sandbox Code Playgroud)

但是,这不会编译.

我试图通过使用调用此方法

Func<IDictionary<string, string>, IDictionary<string, string>> expression = r => r.Value == null;
var result = Filter<string, string>(expression, collection);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Dan*_*rth 7

WhereFunc<TSource, bool>在你的情况下,想要一个Func<KeyValuePair<TKey, TValue>, bool>.

此外,您的方法的返回类型不正确.它应该使用T1T2不是string.此外,最好为通用参数使用描述性名称.而不是T1T2我使用相同的名称作为字典 - TKeyTValue:

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);
}
Run Code Online (Sandbox Code Playgroud)