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

リストの内容が静的な場合にのみルックアップを使用する必要がありますか? Dictionary は簡単に使用できますが、Lookup を試してみたかったのです。

乾杯、

ジェームズ

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 に答える