例如,类似:
Dictionary<string, Func<T1, T2, bool>> comparisons;
comparisons.add("<", (x, y) => x < y);
comparisons.add("==", (x, y) => x == y);
comparisons.add(">", (x, y) => x > y);
在这一点上,我对C#lambda和多类型通用容器的了解还不足以将它们正确地组合在一起。这有可能吗?
最佳答案
泛型类型必须在编译时就已知道,因此您不能进行动态委托(delegate)。如果指定数据类型,则可以创建代表字典:
Dictionary<string, Func<int, int, bool>> comparisons;
comparisons.add("<", (x, y) => x < y);
comparisons.add("==", (x, y) => x == y);
comparisons.add(">", (x, y) => x > y);
您可以使用
IComparable
接口(interface)来允许不同的类型,但是您只能使用它的CompareTo
方法来实现运算符:Dictionary<string, Func<IComparable, IComparable, bool>> comparisons;
comparisons.add("<", (x, y) => x.CompareTo(y) < 0);
comparisons.add("==", (x, y) => x.CompareTo(y) == 0);
comparisons.add(">", (x, y) => x.CompareTo(y) > 0);
当然,这对使用的数据有较少的限制,例如,您可以将
string
和DateTime
值提供给运算符(operator)委托(delegate),并且可以很好地进行编译。直到您运行它,它才会失败。