【C#】Windows排序方式实现 StrcmplogicalW

在C#开发中,字符串排序10会排在2的前面,使用StrcmplogicalW 方法可以实现和Windows排序一样的效果,2排在10前面。

[DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);

当然我们也可以自己实现该排序方式:

using System;
using System.Collections.Generic;
using System.Globalization;

public class LogicalComparer : IComparer<string>
{
    private readonly CompareInfo _compareInfo;
    private readonly CompareOptions _options;

    public LogicalComparer(CultureInfo culture = null, bool ignoreCase = true)
    {
        _compareInfo = (culture ?? CultureInfo.CurrentCulture).CompareInfo;
        _options = ignoreCase 
            ? CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace
            : CompareOptions.IgnoreNonSpace;
    }

    public int Compare(string x, string y)
    {
        if (x == y) return 0;
        if (x == null) return -1;
        if (y == null) return 1;

        // 使用CompareInfo进行逻辑比较
        return _compareInfo.Compare(x, y, _options | CompareOptions.StringSort);
    }
}

public class Program
{
    public static void Main()
    {
        string[] files = {
            "file1.txt", "file10.txt", "file2.txt", 
            "FileA.txt", "Filea.txt", "file.txt"
        };

        // 使用逻辑比较器排序
        Array.Sort(files, new LogicalComparer());

        Console.WriteLine("逻辑排序结果:");
        foreach (var file in files)
        {
            Console.WriteLine(file);
        }
    }
}

 

posted on 2025-07-17 11:40  梦琪小生  阅读(46)  评论(0)    收藏  举报

导航