Linq Lookup动态列表

时间:2009-11-13 09:14:54

标签: c# .net linq caching lookup

我有一个对象列表(字符串文件名,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?我可以轻松使用词典,但想尝试查找。

干杯,

詹姆斯

2 个答案:

答案 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
}