2012-11-16 63 views
8

Tôi tự hỏi liệu đây có phải là sự lựa chọn chính xác cho từ điển không? Những gì tôi muốn làm là sử dụng một biểu thức như là chìa khóa trong một từ điển, một cái gì đó như:Từ điển với Func là khóa

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 

Ý tưởng này là một cách sạch hơn so với có lớn nếu có hoặc chuyển báo cáo.

Điều này có hợp lý không? Nó có hoạt động không? Có cách nào đơn giản hơn không?

+1

Trong một từ; Không. Nó thường là một giá trị thích hợp, nhưng như một chìa khóa tôi muốn tránh nó. – Servy

+2

..Điều đó sẽ làm đầu của tôi trong việc duy trì điều đó .. –

Trả lời

7

Không, C# xây dựng một thể hiện ủy nhiệm mới bất cứ khi nào lambda được sử dụng để bạn không thể sử dụng nó làm khóa nhất quán. Ví dụ:

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

Điều này sẽ làm cho việc sử dụng trở nên khó xử như một khóa từ điển trừ khi bạn có cách nào khác để luôn có được cùng một phiên bản.

Edit:

Eric Lippert của câu trả lời here chỉ ra rằng trình biên dịch là phép để phát hiện các lambdas đều giống nhau (mặc dù nó thường không). Dù bằng cách nào một lambda/đại biểu làm cho một sự lựa chọn nghèo cho một chìa khóa.

+0

ok cảm ơn, thats xóa rằng lên – user380689

6

Xem xét cách bạn sử dụng bản đồ, bạn sẽ tốt hơn với List<Tuple<Func<int,bool>,int>>, vì thứ tự kiểm tra lambdas sẽ không còn tùy ý, như trong từ điển dựa trên băm. Cách tiếp cận này cũng cho phép bạn bỏ qua bước tra cứu:

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

hmm, thats thú vị tôi cần phải nghiên cứu nó nhiều hơn nữa. cảm ơn bạn. – user380689

Các vấn đề liên quan