2009-11-13 6 views
0

J'ai une liste d'objets (nom de fichier de la chaîne, image BitmapImage) à utiliser comme cache des images. J'ai créé une recherche pour vérifier cette mémoire cache pour une image chaque fois que cela est nécessaire. Si l'image ne figure pas dans la liste, elle est ajoutée à la liste.Liste dynamique Linq Lookup

Le Regarda statiquement créé

private static Lookup<string, ImageData> FileNameLookup = (Lookup<string, ImageData>) 
       imageCache.ToLookup(data => data.ImageFileName, data => data); 

Cependant, à moins que je Recréez le FileNameLookup chaque fois que j'ajouter un élément à la liste de recherche ne retourne jamais la objets qui ont le même nom de fichier.

public static void Reinit() 
{ 
    FileNameLookup = (Lookup<string, ImageData>) imageCache.ToLookup(data => 
               data.ImageFileName, data => data); 
} 

Une recherche ne doit-elle être utilisée que si le contenu de la liste est statique? Je peux facilement utiliser un dictionnaire, mais je voulais essayer une recherche.

Cheers,

James

Répondre

0

La variable statique FileNameLookup est construit à partir du contenu de la liste imageCache à un certain moment dans le temps. Si plus tard vous ajoutez un nouvel élément à la liste, cela ne reflétera pas la recherche. Un dictionnaire serait en effet une meilleure solution pour la mise en cache si vous ne pouvez pas utiliser l'ASP.NET intégré cache.

0

Soit utiliser un dictionnaire où le nom de fichier est la clé et l'image est la valeur

Ou si vous préférez garder les ImageData objet que vous pouvez créer une sous-classe de KeyedCollection qui extrait la propriété du nom de fichier et l'utilise comme clé:

class ImageCache : System.Collections.ObjectModel.KeyedCollection<string, ImageData> 
{ 
    protected override string GetKeyForItem(ImageData item) 
    { 
     return item.ImageFileName; 
    } 
} 

et l'utiliser comme ceci

ImageCache c = new ImageCache(); 
string path = @"c:\somepath\image.jpg"; 
if (c.Contains(path)) 
{ 
    return c[path]; 
} 
else 
{ 
    // put something into the cache 
}