2012-11-16 12 views
8

これが辞書のキーの本質的な選択肢であるかどうか疑問に思っていますか?私がやりたいことは辞書でキーとして式を使用している、のようなもの:Funcをキーとした辞書

var map3 = new Dictionary<Func<int, bool>, 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またはスイッチステートメントを持つよりもきれいな方法です。

これは意味がありますか?それは働くでしょうか?もっと簡単な方法はありますか?

+1

いいえ。それはしばしば適切な値ですが、キーとして私はそれを避けるでしょう。 – Servy

+2

..それを維持することで私の頭をするだろう.. –

答えて

7

いいえ、C#はラムダが使用されると必ず新しいデリゲートインスタンスを作成し、一貫性のあるキーとして使用することはできません。例:あなたは、常に同じインスタンスを取得するためにいくつかの他の方法を持っていない限り、これはその後、辞書のキーとして使用が厄介になるだろう

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

編集:

エリックリペットの答えhereは、コンパイラがラムダを検出することがを許可されていることを示している(それは一般的にはありませんが)が同じです。いずれにしても、ラムダ/デリゲートはキーの選択肢が貧弱です。

+0

おかげで、thatsはそれをクリアした – user380689

6

マップを使用する方法を考慮すると、ラムダのチェック順序はハッシュベースの辞書のように、もはや恣意的ではなくなるため、List<Tuple<Func<int,bool>,int>>の方がよいでしょう。また、この方法では、検索手順をスキップできます。

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

うーん、面白い、私はもっとそれを勉強する必要があります。ありがとうございました。 – user380689

関連する問題