C# 我可以在字典中存储嵌套的lambda表达式吗?

C# 我可以在字典中存储嵌套的lambda表达式吗?,c#,linq,functional-programming,C#,Linq,Functional Programming,我想把字符串解析成C语言中的lambda表达式, 例如,将lt 5解析为x=>xx的一部分。 private readonly static List<Tuple<List<string>, Func<double, Func<double, bool>>>> operationList = new Dictionary<string, Func<double, Func<double, bool>>

我想把字符串解析成C语言中的lambda表达式, 例如,将lt 5解析为x=>x<5,以便我可以将其用作Enumerable的参数。其中:

首先,我制作了一个operationList,它存储一个元组,其中Item1向操作符描述所有别名,Item2存储操作符的一个通用版本

然后Parse将字符串lt 5拆分为[lt,5],并根据键lt搜索操作

最后,如果我能找到这个运算,5将被部分应用于它,结果将是一个lambda表达式x=>x 然而,编译器对{lt将const更改为readonly并使其为静态非常恼火,如下所示:

private readonly static List<Tuple<List<string>, Func<double, Func<double, bool>>>> operationList =
    new Dictionary<string, Func<double, Func<double, bool>>>()
    { { "lt <",     val => ( x => x <  val ) }
    , { "le <=",    val => ( x => x <= val ) }
    , { "eq = ==" , val => ( x => x == val ) }
    , { "ne != <>", val => ( x => x != val ) }
    , { "ge >=",    val => ( x => x >= val ) }
    , { "gt >",     val => ( x => x >  val ) } }
    .Select(kv =>
        new Tuple<
            List<string>,
            Func<double, Func<double, bool>>>(
                kv.Key.Split(' ').ToList(),
                kv.Value))
    .ToList();
In C关键字用于表示编译时常量,但在示例中,列表是在运行时使用LINQ计算的

在C中,const值始终是静态的,将其设为只读会将字段的作用域更改为实例

注意,列表中的内容可能在执行过程中发生变化,并且只读不会阻止您删除和添加Tuples到列表中。请考虑使用它仍然不会阻止您修改它,只会使它变得更难或不使用.NET BCL < /P>的一部分。

private readonly static List<Tuple<List<string>, Func<double, Func<double, bool>>>> operationList =
    new Dictionary<string, Func<double, Func<double, bool>>>()
    { { "lt <",     val => ( x => x <  val ) }
    , { "le <=",    val => ( x => x <= val ) }
    , { "eq = ==" , val => ( x => x == val ) }
    , { "ne != <>", val => ( x => x != val ) }
    , { "ge >=",    val => ( x => x >= val ) }
    , { "gt >",     val => ( x => x >  val ) } }
    .Select(kv =>
        new Tuple<
            List<string>,
            Func<double, Func<double, bool>>>(
                kv.Key.Split(' ').ToList(),
                kv.Value))
    .ToList();