C# 排序列表<;FileInfo>;按自然顺序排列。

C# 排序列表<;FileInfo>;按自然顺序排列。,c#,list,fileinfo,C#,List,Fileinfo,我有一个从WCF服务返回的列表,用于服务器上的文件列表。 稍后我将使用它在客户端应用程序中填充TreeView 我需要列表按自然顺序排列 例如: 我有一个类似于list-1的列表,我的预期结果是list-2 但是我得到了List-3作为我的输出。(参考下面给出的列表) 到目前为止,我已经查看了stackoverflow的帖子: [1] :[2]: 如果发现他们中没有人为我的案子工作,我们将不胜感激:)给你;用于自然排序的便捷列表扩展: using System; using System.Col

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

我需要列表按自然顺序排列

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

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

[1] :[2]:


如果发现他们中没有人为我的案子工作,我们将不胜感激:)

给你;用于自然排序的便捷列表扩展:

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

这利用了Windows API方法,该方法执行自然排序顺序比较,并使用p/Invoke调用它;用于自然排序的便捷列表扩展:

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

这利用了Windows API方法,该方法执行自然排序顺序比较,并使用p/Invoke调用它;用于自然排序的便捷列表扩展:

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

这利用了Windows API方法,该方法执行自然排序顺序比较,并使用p/Invoke调用它;用于自然排序的便捷列表扩展:

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


这利用了Windows API方法,该方法执行自然排序顺序比较,并使用p/Invoke来调用它。

您的文件名是否总是包含非数字字符,然后是可选数字?或者如何?可能是任何内容。。在任何文件系统中,我们如何给出文件名您的文件名总是包含非数字字符,然后是可选的数字吗?或者呢?不,它可以是任何东西。。在任何文件系统中,我们如何给出文件名您的文件名总是包含非数字字符,然后是可选的数字吗?或者呢?不,它可以是任何东西。。在任何文件系统中,我们如何给出文件名您的文件名总是包含非数字字符,然后是可选的数字吗?或者呢?不,它可以是任何东西。。如何在任何文件系统中指定文件名对不起,沃森,但我不想这样做,因为它已经是一个大应用程序了,为一个简单的任务添加Dll还不够好,它们也应该是一些更简单的方法。@MakIndia您不是在添加Dll;该DLL已经是Windows API的一部分,并且将安装在所有版本的Windows上。我很怀疑你会找到比这更简单的方法(实际上只使用一行代码来声明P/Invoke,一行代码来调用它…)只是澄清我的疑问:我的意思是在所有版本的windows 7,8中,它会一直存在吗?它的访问权限呢?如果系统的访问权限有限怎么办,它仍然可以工作得很好。&是的,它会工作得很好。它是Windows API的一个基本部分,自Windows 98以来就一直存在。它不太可能从任何未来版本的Windows中删除;这将破坏许多应用程序@csharpcoder为此,您必须使用
SortedDictionary
,以及使用
strmplogical()实现的自定义
IComparer
。这不是一个完全琐碎的问题,这是一个不同的问题,所以你应该问一个新问题。对不起,沃森,但我不想这样做,因为它已经是一个大的应用程序,为一个简单的任务添加Dll还不够好,它们应该是一些更简单的方法。@MakIndia你没有添加Dll;该DLL已经是Windows API的一部分,并且将安装在所有版本的Windows上。我很怀疑你会找到比这更简单的方法(实际上只使用一行代码来声明P/Invoke,一行代码来调用它…)只是澄清我的疑问:我的意思是在所有版本的windows 7,8中,它会一直存在吗?它的访问权限呢?如果系统的访问权限有限怎么办,它仍然可以工作得很好。&是的,它会工作得很好。它是Windows API的一个基本部分,自Windows 98以来就一直存在。它不太可能从任何未来版本的Windows中删除;这将破坏许多应用程序@csharpcoder为此,您必须使用
SortedDictionary
,以及使用
strmplogical()实现的自定义
IComparer
。这不是一个完全琐碎的问题,这是一个不同的问题,所以你应该问一个新问题。对不起,沃森,但我不想这样做,因为它已经是一个大的应用程序,为一个简单的任务添加Dll还不够好,它们应该是一些更简单的方法。@MakIndia你没有添加Dll;该DLL已经是Windows API的一部分,并且将安装在所有版本的Windows上。我很怀疑你会找到比这更简单的方法(实际上只使用一行代码来声明P/Invoke,一行代码来调用它…)只是澄清我的疑问:我的意思是在所有版本的windows 7,8中,它会一直存在吗?它的访问权限呢?如果系统的访问权限有限怎么办,它仍然可以工作得很好。&是的,它会工作得很好。它是Windows API的一个基本部分,自Windows 98以来就一直存在。它不太可能从任何未来版本的Windows中删除;这将破坏许多应用程序@csharpcoder为此,您必须使用
SortedDictionary
,以及使用
strmplogical()实现的自定义
IComparer
。这不是一个完全琐碎的问题,这是一个不同的问题,所以你应该问一个新问题。对不起,沃森,但我不想这样做,因为它已经是一个大的应用程序,为一个简单的任务添加Dll还不够好,它们应该是一些更简单的方法。@MakIndia你没有添加Dll;该DLL已经是Windows API的一部分,并且将安装在所有版本的Windows上。我严重怀疑您是否会找到比这更简单的方法(实际上只使用一行代码来声明P/Invoke,一行代码来声明P/Invoke)