例如,类似:

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);

当然,这对使用的数据有较少的限制,例如,您可以将stringDateTime值提供给运算符(operator)委托(delegate),并且可以很好地进行编译。直到您运行它,它才会失败。

10-06 14:58