我正在选择文件夹中的所有文件,并将所有文件名添加到2个列表中。 xmlFilePath
和listVersion
作为示例,我的文件名如下所示
1.8.1
1.8.2
1.10.0
1.10.1
但是下面的代码添加如下名称。
1.10.0, 1.10.1, 1.8.1, 1.8.2
我想更改下面的顺序(按名称排序)
1.8.1, 1.8.2, 1.10.0, 1.10.1,
我如何达到这个要求?
FolderBrowserDialog folderDlg = new FolderBrowserDialog();
DialogResult result = folderDlg.ShowDialog();
if (result == DialogResult.OK)
{
string[] files = Directory.GetFiles(folderDlg.SelectedPath);
lblFolder.Text = "Folder : " + folderDlg.SelectedPath;
lblFiles.Text = "No of Xml Found : " + files.Length.ToString();
try
{
foreach (string filePath in Directory.GetFiles(folderDlg.SelectedPath))
{
xmlFilePath.Add(filePath);
}
foreach (string file in files)
{
string fileName = Path.GetFileNameWithoutExtension(file);
listVersion.Add(fileName);
}
}
catch (System.Exception ex)
{
lbl_notifications.Text = ex.Message;
}
}
答案 0 :(得分:1)
问题在于它将名称排序为文本,而不考虑项目的数值。在文本中," 1"小于" 8"并且" 1"并不重要。之后是" 0"。
这样做:
string[] files = Directory.GetFiles(folderDlg.SelectedPath);
files = files.OrderBy(f => int.Parse(f.Split(".")[0]))
.ThenBy(f => int.Parse(f.Split(".")[1]))
.ThenBy(f => int.Parse(f.Split(".")[2])).ToArray();
您可以通过在开头创建包含文件名和拆分部分的.Select()
投影来进一步改进,这样您就不必再重新拆分() - 使用相同的字符串,但这应该至少有效。
答案 1 :(得分:1)
如果文件名实际上是版本,则将它们排序为版本:
string[] files = Directory.GetFiles(folderDlg.SelectedPath);
Array.Sort(files, (left, right) =>
new Version(Path.GetFileNameWithoutExtension(left)).CompareTo(
new Version(Path.GetFileNameWithoutExtension(right))));
一般案例中的 编辑,例如对于像"v_1.2.4 bla-bla-bla 5.6.7"
这样的名称,您可以使用StrCmpLogicalW
函数(如文件资源管理器那样)或其模拟
using System.Runtime.InteropServices;
...
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern int StrCmpLogicalW(string x, string y);
...
string[] files = Directory.GetFiles(folderDlg.SelectedPath);
Array.Sort(files, (left, right) => StrCmpLogicalW(
Path.GetFileNameWithoutExtension(left),
Path.GetFileNameWithoutExtension(right)));