4

我们有一个大型的 winforms C# 应用程序,它基本上是一些数据库(CRUD 的东西)的前端,我正在尝试为业务对象实现一些内存缓存。

就像是:

List<Customer> customerCache; // Loaded during app. startup

我已经创建了一些代码来使缓存与数据库保持同步。该代码一直在单独的线程上运行,并且运行良好。我的问题是,根据缓存的大小,在数据库中执行“从 id = x 的客户中选择 *”比使用 foreach(customerCache 中的 foreach Customer cmr)循环遍历缓存以找到该特定对象更快...

有没有办法在我的缓存中快速搜索特定对象?我打算尝试一些算法或更改我的收藏类型,但我希望能听取您的建议。

请注意,我们有几个“List xxxCache”,而且一切都很快(对于小 N,当然)。但是当缓存的数量增加(通常> 3000)时,从数据库中读取的速度会更快。

遍历我的缓存项目以找到特定项目的最佳方法是什么?所有业务项目都继承自一个共同的祖先并具有“ID”属性(整数、唯一)。

对不起我的英语不好,这不是我的主要语言。最好的问候,来自巴西的问候。

4

4 回答 4

6

改为使用Dictionary<int, Customer>。它支持基于键的 O(1) 查找。在这种情况下,键是 Customer.Id。

您可能还想研究其他用于 .Net 的预构建数据库缓存解决方案。

于 2009-04-14T01:20:50.467 回答
0

不使用 List<T>对象,为什么不使用:

键值对

Dictionary 是要使用的正确对象(KeyValuePair 是字典包含的集合**facepalm**

于 2009-04-14T01:21:54.800 回答
0

使用与您需要的索引数量一样多的字典。

dictionary<int,Customer> CustomerIds //(Ids)  
dictionary<string,Customer> CustomerNames //(Names)  
//or  
dictionary<string,List<Customer>> //(if name is not unique)
于 2009-04-14T02:16:27.820 回答
0

对于 Web 表单应用程序,我们有一个类似的案例。我们使用 MS Enterprise Lib Cache 块。它易于实施和使用。唯一需要关注的就是 Cache Key (string type) cache.add(key, object) cache.getdata(key)

于 2009-04-15T20:00:51.403 回答