如何通过名称将文件添加到列表中?

时间:2016-02-25 05:51:40

标签: c# .net list sorting version

我正在选择文件夹中的所有文件,并将所有文件名添加到2个列表中。 xmlFilePathlistVersion

作为示例,我的文件名如下所示

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;
    }
}

2 个答案:

答案 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)));