排序List< FileInfo>按自然排序的顺序

本文关键字:排序 自然 顺序 List FileInfo | 更新日期: 2023-09-27 18:03:59

我有一个从WCF服务返回的列表,用于服务器上的文件列表。我后来用它来填充TreeView在我的客户端应用程序

我需要列表按自然排序。

例如:我有一个类似List-1的列表,我的期望结果是List-2但我得到List-3作为我的输出。(参考下表)

List-1          List-2          List-3
abc.jpg         abc.jpg         abc.jpg
abc10.jpg       abc10.jpg       abc10.jpg
abc100.jpg      abc97.jpg       abc100.jpg
abc98.jpg       abc98.jpg       abc101.jpg
abc97.jpg       abc100.jpg      abc102.jpg
abc102.jpg      abc101.jpg      abc97.jpg
abc101.jpg      abc102.jpg      abc98.jpg

到目前为止,我已经查看了stackoverflow的帖子:

[1]: c#按自然数排序文件?[2]:基于文件名(SQL文件)的自然排序对FileInfo[]进行排序。

他们都没有发现为我的情况工作,任何帮助将不胜感激:)

排序List< FileInfo>按自然排序的顺序

给你;一个方便的自然排序列表扩展:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace Demo
{
    // A List extension class for natural sorting.
    public static class ListExt
    {
        [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
        private static extern int StrCmpLogicalW(string lhs, string rhs);
        // Version for lists of any type.
        public static void SortNatural<T>(this List<T> self, Func<T, string> stringSelector)
        {
            self.Sort((lhs, rhs) => StrCmpLogicalW(stringSelector(lhs), stringSelector(rhs)));
        }
        // Simpler version for List<string>
        public static void SortNatural(this List<string> self)
        {
            self.Sort(StrCmpLogicalW);
        }
    }
    // Demonstrate using the List extension.
    public class Program
    {
        private static void Main(string[] args)
        {
            var names = new List<FileInfo>
            {
                new FileInfo("abc.jpg"),
                new FileInfo("abc10.jpg"),
                new FileInfo("abc100.jpg"),
                new FileInfo("abc98.jpg"),
                new FileInfo("abc97.jpg"),
                new FileInfo("abc102.jpg"),
                new FileInfo("abc101.jpg")
            };
            names.SortNatural(x => x.Name);
            foreach (var name in names)
                Console.WriteLine(name);
        }
    }
}

这个程序的输出是:

abc.jpg
abc10.jpg
abc97.jpg
abc98.jpg
abc100.jpg
abc101.jpg
abc102.jpg

这利用了Windows API StrCmpLogicalW()方法,它做了一个自然的排序顺序比较,并使用p/Invoke来调用它。