0

我有一个对象列表(字符串文件名、BitmapImage 图像)用作图像缓存。

private static readonly List<ImageData> imageCache = new List<ImageData>();

我创建了一个查找来在每次需要时检查此缓存中的图像。如果图像不在列表中,则将其添加到列表中。

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);
}

如果列表的内容是静态的,是否应该只使用查找?我可以轻松使用字典,但想尝试查找。

干杯,

詹姆士

4

2 回答 2

1

静态变量是在某个时刻FileNameLookup从列表的内容构建的。imageCache如果稍后您将新元素添加到列表中,这将不会反映查找。如果不能使用内置的 ASP.NET缓存,字典确实是更好的缓存解决方案。

于 2009-11-13T10:17:12.853 回答
0

要么使用字典,其中文件名是键,图像是值

或者,如果您更喜欢保留 ImageData 对象,您可以创建 KeyedCollection 的子类,该子类提取文件名属性并将其用作键:

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
}
于 2009-11-13T10:30:15.643 回答