字典与Func作为关键

我想知道这是否是字典关键词的理智选择? 我想要做的是使用表达式作为字典中的键,如:

var map3 = new Dictionary<Func, int>(); map3.Add((x) => x % 2 == 0, 1); map3.Add((x) => x % 10 == 0, 2); // ... var key = map3.Keys.SingleOrDefault(f => f(2)); // key = (x) => x % 2 // map3[key] = 1 

这个想法比使用大的if-else或switch语句更简洁。

这有意义吗? 它会起作用吗? 有更简单的方法吗?

不,只要使用lambda,C#就会构造一个新的委托实例,因此您将无法将其用作一致的密钥。 例:

  Func f = x => x*x + 1; Func g = x => x*x + 1; Console.WriteLine(f.Equals(g)); // prints False 

这将使得使用尴尬作为字典键,除非你有其他方法来始终获得相同的实例。

编辑:

Eric Lippert 在这里的答案表明允许编译器检测lambda是相同的(虽然它通常不会)。 无论哪种方式,lambda / delegate都是键的糟糕选择。

考虑到你使用地图的方式,你最好使用List,int>> ,因为检查lambdas的顺序将不再是任意的,就像在基于散列的情况下一样字典。 此方法还允许您跳过查找步骤:

 var map3 = new List,int>> { new Tuple,int>((x) => x % 2 == 0, 1) , new Tuple,int>((x) => x % 10 == 0, 2) }; var t = map3.SingleOrDefault(t => t.Item1(2)); if (t != null) { var v = t.Item2; }