-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 后才使用 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 回答