Caching ist Key
Wie die anderen gesagt haben, haben Sie das Caching verwenden, da Sie sich wiederholende Disk ausführen I/O auf Daten, die nicht oft ändern.
In meinem Beispiel wird ein List<T>
der Bilddateipfade erstellt und zwischengespeichert, die Sie für jede weitere Anfrage benötigen. System.Web.Caching
ist perfekt dafür, weil Sie ein CacheDependency
Objekt direkt in Ihrem Bildverzeichnis erstellen können - wenn eine Datei geändert oder hinzugefügt wird, wird Ihr Cache automatisch ungültig gemacht. Es wird dann neu erstellt, wenn es das nächste Mal angefordert wird.
Vermeidung von Dubletten mit dem HashSet<T>
Ich wette, Sie wollen nicht zwei gleiche Bilder immer in der Kopfzeile zeigt nach oben!
Die Randomisierung mit Random.Next
schließt zuvor erzeugte Duplikate nicht aus. Ich habe einen HashSet<T>
als einzigartigen Zufallsgenerator des armen Mannes verwendet, da der HashSet<T>
nur Ihnen erlaubt, einzigartige Werte hinzuzufügen.
Das Modell
Diese Operation sollte ein Teil Ihres Modells in MVC sein. Sie ändern es, um mit Ihren anderen Daten abrufenden Klassen zu gehen, wie Sie für richtig halten.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Caching;
public class RandomImage
{
public static string[] GetImages(string folder, int count)
{
HttpContext context = HttpContext.Current;
string virtualFolderPath = string.Format("/content/{0}/", folder);
string absoluteFolderPath = context.Server.MapPath(virtualFolderPath);
Cache cache = context.Cache;
var images = cache[folder + "_images"] as List<string>;
// cache string array if it does not exist
if (images == null)
{
var di = new DirectoryInfo(absoluteFolderPath);
images = (from fi in di.GetFiles()
where fi.Extension.ToLower() == ".jpg" || fi.Extension.ToLower() == ".gif"
select string.Format("{0}{1}", virtualFolderPath, fi.Name))
.ToList();
// create cach dependency on image randomFolderName
cache.Insert(folder + "_images", images, new CacheDependency(absoluteFolderPath));
}
Random random = new Random();
var imageSet = new HashSet<string>();
if (count > images.Count())
{
throw new ArgumentOutOfRangeException("count");
}
while (imageSet.Count() < count)
{
//using an hashset will ensure a random set with unique values.
imageSet.Add(images[random.Next(count)]);
}
return imageSet.ToArray();
}
}
Der Regler
Rufen Sie die Methode in der Controller so etwas wie ....
string[] images = Models.RandomImage.GetImages("myPictures", 4);
Eine Hilfsfunktion, die * N * zufälligen Dateinamen erhalten würde. Um Duplikate zu vermeiden;) –