我想按升序对文件夹中的文件进行排序,以便我可以正确组合这些文件,但我得到的输出是 1,10,11 一样明智,我希望输出为 1,2,3 .. 同样地。 我正在使用这个,
DirectoryInfo di = new DirectoryInfo(source_path);
FileInfo[] arrFi = di.GetFiles("*.*");
//arrFi.OrderBy(fi=>fi.LastWriteTime);
Array.Sort(arrFi.OrderBy(fi => fi.LastWriteTime));
答案 0 :(得分:0)
不清楚想要的结果是什么样的。如果您想按上次写入时间对文件进行排序 简单的 Linq 查询就可以:
var arrFi = new DirectoryInfo(source_path)
.EnumerateFiles("*.*")
.OrderBy(file => file.LastWriteTime)
.ToArray();
如果您想按自然顺序(即"1" < "5" < "9" < "10" < "12" < "100"
)按文件名称对文件进行排序
查询本身将和上一个一样简单:
var arrFi = new DirectoryInfo(source_path)
.EnumerateFiles("*.*")
.OrderBy(file => file.Name, new StringNaturalComparer(null))
.ToArray();
但是你必须实现比较器:
public sealed class StringNaturalComparer : IComparer<String> {
private readonly IComparer<string> m_Comparer;
private static List<string> ToChunks(string value) {
List<string> result = new();
StringBuilder sb = null;
bool isDigit = false;
foreach (var c in value) {
if (sb is null) {
sb = new StringBuilder(value.Length);
isDigit = char.IsDigit(c);
sb.Append(c);
}
else if (isDigit != char.IsDigit(c)) {
result.Add(sb.ToString());
sb.Clear();
isDigit = char.IsDigit(c);
}
sb.Append(c);
}
if (sb != null)
result.Add(sb.ToString());
return result;
}
public StringNaturalComparer(IComparer<string> comparer) {
m_Comparer = comparer == null ? StringComparer.Ordinal : comparer;
}
public int Compare(string left, string right) {
if (ReferenceEquals(left, right))
return 0;
else if (left == null)
return -1;
else if (right == null)
return 1;
var lefts = ToChunks(left);
var rights = ToChunks(right);
int result;
for (int i = 0; i < Math.Min(lefts.Count, rights.Count); ++i) {
string leftChunk = lefts[i];
string rightChunk = rights[i];
if (char.IsDigit(leftChunk[0]) && char.IsDigit(rightChunk[0])) {
result = leftChunk.Length.CompareTo(rightChunk.Length);
if (result != 0)
return result;
}
result = m_Comparer.Compare(leftChunk, rightChunk);
if (result != 0)
return result;
}
return lefts.Count.CompareTo(rights.Count);
}
}