在一个文件夹中,我有这些文件。 Windows资源管理器上的顺序是:
这是我从文件夹中获取文件的方式:
var files = Directory.GetFiles(inputImage, "*.*", SearchOption.TopDirectoryOnly);
但订单将是:
即使我尝试过:Array.Sort(files);
但顺序是一样的,如何使用此顺序加载文件:
答案 0 :(得分:2)
您需要实现自己的比较,以“实现”它们包含嵌入的非零填充数字的方式比较两个字符串。资源管理器已包含此逻辑,并且(根据评论)在StrCmpLogicalW
中公开,您可以在自定义Comparer<string>
实现中使用P/Invoke调用该实现,您可以将其传递给排序方法。
如果你知道关于名称的所有其他信息(即模式),那么很容易去除固定部分以进行比较 - 但StrCmpLogicalW
将为你提供一个很好的通用实现。
当然,如果您控制创建文件的任何内容,更简单的方法是将文件名填充到一些合理数量的数字,例如5或6。
答案 1 :(得分:2)
请记住,默认情况下,Array.Sort(文件)将文件名排序为文本,而不是数字。尝试解析数字,然后按那些排序。
答案 2 :(得分:2)
好吧,我会尝试这样的事情:
var files = from file in directoryInfo.EnumerateFiles()
.Where(f => f.Extension == ".jpg")
orderby ExtractNumber(file.Name) ascending
select file.FullName;
return files.ToList<string>();
这里我们提取文件号 - 在(和) - 。
之间private static object ExtractNumber(string p)
{
int lenght = p.IndexOf(')') - p.IndexOf('(');
return int.Parse(p.Substring(p.IndexOf('('), lenght - 1));
}
我很确定必须有一个有效的方法来做到这一点,但只是我的两分钱。
答案 3 :(得分:2)
如果以简单的方式加载文件:
string[] files = Directory.GetFiles ("folder");
并假设括号中始终有数字,您可以使用函数:
Array.Sort (files, compareFilesWithBrackets);
带比较功能:
public static int compareFilesWithBrackets (string arg1, string arg2)
{
string filename1 = System.IO.Path.GetFileName (arg1); //extract filename from the path of the first file
string filename2 = System.IO.Path.GetFileName (arg2); // extract second file filename
Match m = Regex.Match (filename1, "\\(([0-9]+)\\)"); // check if there is (number) for file 1
int file1 = 0; // if no number leave 0
if (m.Success) { // else if success parse the number from brackets
file1 = int.Parse (m.Groups [1].Value);
}
m = Regex.Match (filename2, "\\(([0-9]+)\\)");
int file2 = 0;
if (m.Success) {
file2 = int.Parse (m.Groups [1].Value);
}
return file1 - file2;
}
答案 4 :(得分:1)
如果是我,我会创建一个字典对象并将第一个值存储为原始文件名,将第二个值存储为您需要按摩的自定义文件名。
因此,例如,字典对象看起来像这样:
input (1).jpg | input (001).jpg
input (2).jpg | input (002).jpg
input (101).jpg | input (101).jpg
然后你可以对第二个字段进行排序,但是从字典对象的第一个字段中提取文件名。
答案 5 :(得分:1)
您可以在http://msdn.microsoft.com/en-us/library/bb534966.aspx
使用OrderBy扩展程序,更多详细信息这是一个简单的lambda表达式,t =&gt;部分。如果需要,您可以在进行排序之前进行一些操作。
var files = Directory.GetFiles(inputImage, "*.*", SearchOption.TopDirectoryOnly).OrderBy(t => t);
如果您只想对数字进行排序,可以使用一些聪明的字符串替换,如
.OrderBy(t => t.Replace("input", "").Replace("(", "").Replace(")","").Trim());
答案 6 :(得分:1)
这CustomSort可以提供帮助
List<string> list = new List<string>()
{
"input (1).jpg","input (101).jpg", "input (11).jpg", "input (2).jpg"
};
var sortedList = list.CustomSort().ToList();
输出将是:
input (1).jpg
input (2).jpg
input (11).jpg
input (101).jpg
我会在这里复制代码
public static class MyExtensions
{
public static IEnumerable<string> CustomSort(this IEnumerable<string> list)
{
int maxLen = list.Select(s => s.Length).Max();
return list.Select(s => new
{
OrgStr = s,
SortStr = Regex.Replace(s, @"(\d+)|(\D+)", m => m.Value.PadLeft(maxLen, char.IsDigit(m.Value[0]) ? ' ' : '\xffff'))
})
.OrderBy(x => x.SortStr)
.Select(x => x.OrgStr);
}
}