首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按自然排序顺序对List<FileInfo>排序。

按自然排序顺序对List<FileInfo>排序。
EN

Stack Overflow用户
提问于 2015-07-21 11:51:19
回答 1查看 1K关注 0票数 0

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

我需要名单按自然顺序排列。

对于示例:我有一个类似于List-1的列表,我的预期结果是List-2,但输出是List-3

代码语言:javascript
复制
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

到目前为止,我已经查看了堆叠溢出的帖子:

1 :C# Sort files by natural number ordering in the name? 2:Sorting a FileInfo[] based using Natural Sorting on the filename (SQL files) .

没有人为我的案子工作,任何帮助都将不胜感激:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-21 11:59:01

这是一个方便的列表扩展,用于自然排序:

代码语言:javascript
复制
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);
        }
    }
}

该程序的输出是:

代码语言:javascript
复制
abc.jpg
abc10.jpg
abc97.jpg
abc98.jpg
abc100.jpg
abc101.jpg
abc102.jpg

这利用了Windows StrCmpLogicalW()方法的优势,该方法可以进行自然排序顺序比较,并使用P/Invoke调用它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31538293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档