-3

並べ替えには次のコードを使用します。

var fileEntries = from f in Directory.GetFiles(Application.StartupPath + "/TrainedFaces/", "*.bmp", SearchOption.AllDirectories) 
                  let fi = new FileInfo(f) 
                  orderby fi.Name 
                  select fi.FullName;

何か問題があります Face10、Face11 を最初に配置すると、Face10 を取得した後に face1 を取得するため、これが問題です

これは私が望む出力です

[0] = "N:\FaceRecProOV - Copy (2)\FaceRecProOV\bin\Debug/TrainedFace/1\ 1.bmp"
[1] = "N:\FaceRecProOV - Copy (2)\FaceRecProOV\bin\Debug/TrainedFaces/2\ 2.bmp"
[2] = "N:\FaceRecProOV - Copy (2)\FaceRecProOV\bin\Debug/TrainedFaces/3\ 3.bmp"
[3] = "N:\FaceRecProOV - Copy (2)\FaceRecProOV\bin\Debug/TrainedFaces/4\ 4.bmp"
[4] = "N:\FaceRecProOV - Copy (2)\FaceRecProOV\bin\Debug/TrainedFaces/4\ 9.bmp"
[5] = "N:\FaceRecProOV - Copy (2)\FaceRecProOV\bin\Debug/TrainedFaces/4\ 10.bmp"

しかし、それは与えます

[0] = "N:\FaceRecProOV - Copy (2)\FaceRecProOV\bin\Debug/TrainedFace/1\ 1.bmp"
[5] = "N:\FaceRecProOV - Copy (2)\FaceRecProOV\bin\Debug/TrainedFaces/4\ 10.bmp"
[1] = "N:\FaceRecProOV - Copy (2)\FaceRecProOV\bin\Debug/TrainedFaces/2\ 2.bmp"

コードのどこが間違っていますか???

4

3 に答える 3

2

これは、文字列であると想定して並べ替えているためです("10"は"2."の前にあります)。

ファイル名を取得してintに変換し、それに基づいて並べ替える必要があります。

于 2012-09-19T19:25:39.503 に答える
1

数値順ではなく、アルファベット順にデータを並べ替えています。入力をまったく変更できないと仮定すると、ファイル名を数値に解析してから並べ替える必要があります。

var fileEntries = from f in Directory.GetFiles(Application.StartupPath + "/TrainedFaces/", "*.bmp", SearchOption.AllDirectories) 
let fi = new FileInfo(f) 
orderby parse(fi.Name )
select fi.FullName;

public static int Parse(string filename)
{
  //for your real program you'll want to ensure that there is error handling and determine what to do with non-numeric filenames.
  return int.Parse(filename.Substring(0, filename.LastIndexOf('.'));
}
于 2012-09-19T19:27:49.267 に答える
1
var fileEntries = Directory.GetFiles(Application.StartupPath + "/TrainedFaces/", "*.bmp", SearchOption.AllDirectories)
                           .Select(f=>new FileInfo(f))
                           .OrderNaturallyBy(fi=>fi.Name)
                           .Select(fi=>fi.FullName);


public static class S_O_Extensions
{
    public static IEnumerable<T> OrderNaturallyBy<T>(this IEnumerable<T> list, Func<T,string> selector)
    {
        return list.Select(item => new
                    {
                        t = item,
                        tempstr = Regex.Replace(selector(item), @"\d+", m => m.Value.PadLeft(20, '0'))
                    })
                    .OrderBy(x => x.tempstr)
                    .Select(x => x.t);
    }
}
于 2012-09-19T20:57:46.923 に答える