2016-04-12 10 views
1

は、イム少しトラブル、私のファイルを注文した、私はスタックオーバーフローに研究してきた番号付きファイル名のC#で発注し、他のすべてのメソッドを試してみましたが、私は私のコード厥同じ問題列挙ファイルは

を得続ける:

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

「Foto」+ numberFrom0To300 +「bmp」という名前の写真があります。

このコードはapliedされた後、私のリストの取得が0_10_100_101_102が注文した写真です...

が既に.GetFiles(からデフォルトの順序を試してみました) このコードと のArray.sort usin whitoutスタックオーバーフローで見つかった別の1私はいつも同じ結果帽子奇数次数

を取得するが、私は彼らに0,1,2,3,4を注文する必要があり...全く

のコストayoneはそれを制御するためにどのように良いアイデアを持っているのでしょうか?

+1

あなたはより明確にする必要があります:問題は何ですか?何が間違っているのですか? –

+1

"このコードを書いた後、私のリストには0_10_100_101_102で注文した写真があります..." "しかし、私は0,1,2,3,4を注文しなければなりません。瞬時downvote –

+0

私は*あなたの質問から引用しない*明確に*あなたに尋ねた。 –

答えて

1

lexicographical orderを使用している文字列、番号で注文したい。次に、関連する部分文字列を常に解析する必要があります。 LINQを使用することができます:

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

テスト済みで、適切に機能していれば、アイテムは希望通りに注文されます –

+0

@ElanSanchezOrtiz:どうぞよろしくお願いします。順序を逆にする場合は、 'OrderByDescending'を使用してください。指定された番号(または範囲)で写真を検索する場合は、 'Where(x => x.Integer == 123)'を使用します。 –

1

クイック(しかしダーティてもよい - 必要相互運用)溶液を異なる方法でソートすることである。

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

トリックstring.Compare辞書式方法(など"10" < "9")で比較することである場合StrCmpLogicalWは、論理の種類を提供します。ソート("10" > "9"

+0

Thx!それはインポートしなければならなかったので、他の答えを使用し、私には簡単だったが、多くのthx!他の誰かに役立つかもしれません! –