[英]sort files of folder in ascending order in C#
我想按升序对文件夹的文件进行排序,以便我可以正确组合这些文件,但我得到的 output 是 1,10,11,我希望 output 是 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));
目前尚不清楚期望的结果是什么样的。 如果您想按文件的最后写入时间对文件进行排序,则可以使用简单的 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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.