2016-12-04 1 views
0

I unten KlasseErstellen Sie ein neues Objekt für jedes Element in einer Liste

public class Photo 
{ 
    public int ShowOrder { get; set; } 
    public string Format { get; set; } 
    public byte[] Image { get; set; } 
} 

Ich habe hartcodierte Codezeilen Bilder aus einem Ordner zu laden und sie auf eine Variable vom Typ hinzufügen List<Photo>

var Photos = new List<Photo>() 
{ 
    new Photo() { ShowOrder = 1, Image = File.ReadAllBytes("D:\\Sample\\pic1.jpg")), Format = "jpg" }, 
    new Photo() { ShowOrder = 2, Image = File.ReadAllBytes("D:\\Sample\\pic2.png")), Format = "png" }, 
    new Photo() { ShowOrder = 3, Image = File.ReadAllBytes("D:\\Sample\\pic3.jpg")), Format = "jpg" }, 
    new Photo() { ShowOrder = 4, Image = File.ReadAllBytes("D:\\Sample\\pic4.gif")), Format = "gif" } 
} 

Ich möchte diesen Teil dynamisch machen, um alle Fotos im Ordner zu laden, anstatt hart zu codieren.

Ich dachte, ich kann ForEach Funktion verwenden, aber konnte nicht herausfinden, wie. Gibt es eine Möglichkeit, dies mit LINQ zu tun?

Antwort

1

Sie können den folgenden Code versuchen, filtert die Dateien durch die Datei ext und es ist LINQ;

// directory path which you are going to list the image files 
var sourceDir = "directory path"; 

// temp variable for counting file order 
int fileOrder = 0; 

// list of allowed file extentions which the code should find 
var allowedExtensions = new[] { 
".jpg", 
".png", 
".gif", 
".bmp", 
".jpeg" 
}; 

// find all allowed extention files and append them into a list of Photo class 
var photos = Directory.GetFiles(sourceDir) 
         .Where(file => allowedExtensions.Any(file.ToLower().EndsWith)) 
         .Select(imageFile => new Photo() 
         { 
          ShowOrder = ++fileOrder, 
          Format = imageFile.Substring(imageFile.LastIndexOf(".")), 
          Image = File.ReadAllBytes(imageFile) 
         }) 
         .ToList(); 

EDIT:

benutzte ich GetFileExtension statt SubString

Directory.GetFiles(sourceDir)) 
        .Where(file => allowedExtensions.Any(file.ToLower().EndsWith)) 
        .Select(imageFile => new Photo() 
        { 
         ShowOrder = ++fileOrder, 
         Image = File.ReadAllBytes(imageFile), 
         Format = Path.GetExtension(imageFile) 
        } 
        ).ToList() 
+1

Genau das, was ich gesucht habe. Ich kann jedoch GetFileExtension anstelle von Substrting verwenden. Vielen Dank. Ich aktualisiere die Antwort. – FLICKER

2

können Sie Directory wie folgt verwenden:

var Photos = new List<Photo>(); 
int itt = 1; 
foreach(var path in Directory.GetFiles(@"D:\Sample")) 
{ 
    Photos.Add(new Photo() {ShowOrder = itt++, Image = File.ReadAllBytes(path)), Format = path.Substring((path.Length - 3), 3) } 
} 

Das alles funktioniert nur, wenn die Dateien in diesem Ordner Bilder sind, aber wenn Sie nicht die Getfiles() mit einem Suchmuster optimieren möchten, können Sie mehr here finden.

+1

Ich denke, Sie sollten 'int itt bewegen = 1 'an der Außenseite des' foreach' Schleife. –

+0

@RichardSchneider Ja, Danke. – Emad

+1

Sie können Path.GetExtension() verwenden, um das Format zu erhalten, das auch für alle Längen-Dateitypen und nicht nur für drei Buchstaben verwendet werden kann. (wie JPEG) – PartlyCloudy

Verwandte Themen