我有一个对象列表(字符串文件名,BitmapImage图像),用作图像缓存。
private static readonly List<ImageData> imageCache = new List<ImageData>();
我创建了一个Lookup,以便在每次需要时检查此缓存的图像。如果图像不在列表中,则会将其添加到列表中。
Looked是静态创建的
private static Lookup<string, ImageData> FileNameLookup = (Lookup<string, ImageData>)
imageCache.ToLookup(data => data.ImageFileName, data => data);
但是,除非每次向列表添加元素时重新创建FileNameLookup,否则Lookup永远不会返回具有相同文件名的对象。
public static void Reinit()
{
FileNameLookup = (Lookup<string, ImageData>) imageCache.ToLookup(data =>
data.ImageFileName, data => data);
}
如果列表内容是静态的,是否只使用Lookup?我可以轻松使用词典,但想尝试查找。
干杯,
詹姆斯
答案 0 :(得分:0)
FileNameLookup
静态变量是在某个时刻根据imageCache
列表的内容构建的。如果以后向列表中添加新元素,则不会反映查找。如果你不能使用内置的ASP.NET cache,字典确实是一个更好的缓存解决方案。
答案 1 :(得分:0)
使用字典,其中filename是键,而image是值
或者,如果您希望保留ImageData对象,则可以创建KeyedCollection的子类,该子类提取filename属性并将其用作键:
class ImageCache : System.Collections.ObjectModel.KeyedCollection<string, ImageData>
{
protected override string GetKeyForItem(ImageData item)
{
return item.ImageFileName;
}
}
并像这样使用它
ImageCache c = new ImageCache();
string path = @"c:\somepath\image.jpg";
if (c.Contains(path))
{
return c[path];
}
else
{
// put something into the cache
}