2009-07-15 25 views
7

Google có sử dụng Expression<Func<T>> hoặc Func<T> làm khóa trong từ điển không? Ví dụ để cache kết quả tính toán nặng.C#: Có thể sử dụng các biểu thức hoặc chức năng như các phím trong từ điển không?

Ví dụ, thay đổi bộ nhớ cache rất cơ bản của tôi từ một different question của tôi một chút:

public static class Cache<T> 
{ 
    // Alternatively using Expression<Func<T>> instead 
    private static Dictionary<Func<T>, T> cache; 
    static Cache() 
    { 
     cache = new Dictionary<Func<T>, T>(); 
    } 
    public static T GetResult(Func<T> f) 
    { 
     if (cache.ContainsKey(f)) 
      return cache[f]; 

     return cache[f] = f(); 
    } 
} 

có này thậm chí làm việc?

Chỉnh sửa: Sau khi kiểm tra nhanh, có vẻ như nó thực sự hoạt động. Nhưng tôi phát hiện ra rằng nó có thể có thể được chung chung hơn, vì nó bây giờ sẽ là một bộ nhớ cache mỗi kiểu trả ... không chắc chắn làm thế nào để thay đổi nó do đó sẽ không xảy ra mặc dù ... hmm

Sửa 2 : Không, chờ đã ... nó thực sự không. Vâng, đối với các phương pháp thường xuyên nó. Nhưng không phải cho lambdas. Họ nhận được nhiều tên phương thức ngẫu nhiên ngay cả khi chúng trông giống nhau. Oh cũng c",)

+2

Tại sao bạn làm điều đó? –

+0

Tôi không. Tôi đã vấp phải suy nghĩ trong khi tìm ra những thứ đệm trong câu hỏi khác của tôi và đã tò mò :) – Svish

+0

Điểm thưởng cho tò mò điều tra, nhưng tôi không thể thực sự nhìn thấy bất kỳ ứng dụng thực sự cho kỹ thuật này. Mặt khác, ý tưởng này có một yếu tố rất mát nếu nó đã có thể làm việc. –

Trả lời

3

Bạn có thể sử dụng bất kỳ loại đối tượng, miễn là nó là một ví dụ. Đó thậm chí trở thành một đại biểu, nhưng tôi làm không khuyên bạn sử dụng các đại biểu như phím vì họ không được thiết kế cho Tôi không chắc rằng các đại biểu được tạo ra độc lập tạo ra cùng một mã băm, thậm chí ít hơn nếu chúng có thể được so sánh (tương đương)

+0

Có vẻ như bạn đúng về các đại biểu không hoạt động tốt cho các khóa =/ – Svish

+0

Các đại biểu so sánh theo tham chiếu, chứ không phải "có cấu trúc". Đó là, hai đại biểu xảy ra để gọi cùng một mã nhưng các trường hợp khác nhau sẽ so sánh là không bằng nhau. –

+0

@Eric Lippert: Vì vậy, tôi nghĩ, đó là một cơ chế dự phòng tự nhiên khi "cấu trúc" so sánh vô nghĩa :) –

0

Điều này có thể là một sự căng thẳng, nhưng sử dụng Thời gian chạy ngôn ngữ động (IronPython, v.v.) chắc chắn có thể chạy đoạn mã tùy ý từ một từ điển

Sau đó, bạn có thể chạy mã khi cần thiết, lưu vào bộ nhớ cache kết quả lần đầu tiên, d sử dụng kết quả được lưu trong bộ nhớ cache cho tất cả các cuộc gọi trong tương lai.

Nếu bạn có nhiều tính toán, tôi đặt cược điều này sẽ kết thúc hoạt động khá tốt. Đó là tất cả tình huống mặc dù, và tôi không chắc chắn chính xác những gì bạn đang cố gắng để đạt được. :)

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