2016-04-12 3 views
1

im leichten Problemen Bestell meine Dateien mit, i auf Stack-Überlauf und versuchten, alle andere Methoden erforscht habe, aber ich halte das gleiche ProblemAufzählen von Dateien Bestellen von Nummerierte Dateinamen C#

Das ist mein Code bekommen:

public static List<Bitmap> CogerFotosAlamacenadas() 
    { 
     List<Bitmap> Lista = new List<Bitmap>(); 
     DirectoryInfo Directorio = new DirectoryInfo(Environment.CurrentDirectory + "\\Almacenamiento"); 
     FileInfo[] ListaDeFotos = Directorio.GetFiles("*.bmp"); 

     Array.Sort(ListaDeFotos, delegate (FileInfo x, FileInfo y) 
     { 
      return string.Compare(x.Name, y.Name); 
     }); 

     foreach (FileInfo foto in ListaDeFotos) 
     { 
      Image PlaceHolder = Image.FromFile(foto.FullName); 

      Lista.Add((Bitmap)PlaceHolder); 

     } 


     return Lista; 
    } 

Ich habe eine Serie von Fotos mit dem Namen: "Foto" + numberFrom0To300 + "bmp";

nach diesem Code meiner Liste get aplied wird sind die von 0_10_100_101_102 bestellten Fotos ...

Bereits die Standardreihenfolge von .GetFiles versucht() diesem Code und ein andere in Stapelüberlauf gefunden whitout array.sort usin ich bekomme immer die gleiche Ergebnis hat ungeradee Bestellnummer

, aber ich habe sie 0,1,2,3,4 bestellen ... bei kostete all

hat ayone eine gute Idee, wie es zu kontrollieren?

+1

Sie müssen klarer sein: Was ist das Problem? Was macht es falsch? –

+1

"Nachdem dieser Code auf meine Liste angewendet wurde, werden die Fotos von 0_10_100_101_102 ..." "bestellt, aber ich muss sie um 0,1,2,3,4 ... um jeden Preis bestellen" ich denke, es ist klar genug, um nicht zu bekommen ein sofortiger Downvote –

+0

Ich bat dich um * Klar * nicht von deiner Frage zu zitieren. –

Antwort

1

Sie vergleichen Zeichenketten, die eine lexicographical order verwenden, möchten Sie nach der Nummer bestellen. Dann müssen Sie immer den relevanten Teilstring analysieren. Sie können LINQ verwenden:

FileInfo[] orderedPhotos = Directorio.EnumerateFiles("*.bmp") 
    .Where(f => f.Name.Length > "Foto.bmp".Length) 
    .Select(f => new { 
     File = f, 
     Number = System.IO.Path.GetFileNameWithoutExtension(f.Name).Substring("Foto".Length) 
    }) 
    .Where(x => x.Number.All(Char.IsDigit)) 
    .Select(x => new { 
     x.File, 
     Integer = int.Parse(x.Number) 
    }) 
    .OrderBy(x => x.Integer) 
    .Select(x => x.File) 
    .ToArray(); 
+0

Getestet und funktioniert einwandfrei, Artikel sind bestellt, wie ich wollte –

+0

@ElanSanchezOrtiz: Gern geschehen. Wenn Sie den Auftrag stornieren möchten, verwenden Sie 'OrderByDescending'. Wenn Sie Fotos mit einer bestimmten Nummer (oder einem bestimmten Bereich) suchen möchten, verwenden Sie 'Where (x => x.Integer == 123)' –

1

Quick (kann aber schmutzig sein - Interop erforderlich) Lösung ist in anderer Weise zu sortieren:

using System.Runtime.InteropServices; 
... 

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] 
private static extern int StrCmpLogicalW(string x, string y); 

... 

// change your current Array.Sort to this one 
Array.Sort(ListaDeFotos, (left, right) => StrCmpLogicalW(left.Name, right.Name)); 

Der Trick ist, dass string.Compare in lexikographischer Weise vergleicht (und so "10" < "9"), wenn StrCmpLogicalW bietet eine Art logische Sortierung ("10" > "9")

+0

Thx für die Antwort! benutzte die andere Antwort, weil es nicht importiert werden musste und war leichter zu mir, aber viel thx! könnte für jemand anderen nützlich sein! –

Verwandte Themen