Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按数字样式对字符串数组排序?_C#_Arrays_String_Sorting - Fatal编程技术网

C# 如何按数字样式对字符串数组排序?

C# 如何按数字样式对字符串数组排序?,c#,arrays,string,sorting,C#,Arrays,String,Sorting,我有一个文件名数组,我想按数字样式排序,请给我一个解决方案 示例1: 原始数组:[name99.txt、name98.txt、name100.txt] 排序数组:[name98.txt、name99.txt、name100.txt] (使用字符串排序,排序结果为[name100.txt,name98.txt,name99.txt]) 示例2: 原始数组:[a99.txt、b98.txt、b100.txt] 排序数组:[a99.txt、b98.txt、b100.txt] (使用字符串排序,排序结果

我有一个文件名数组,我想按数字样式排序,请给我一个解决方案

示例1:

原始数组:
[name99.txt、name98.txt、name100.txt]

排序数组:
[name98.txt、name99.txt、name100.txt]

(使用字符串排序,排序结果为
[name100.txt,name98.txt,name99.txt]

示例2:

原始数组:
[a99.txt、b98.txt、b100.txt]

排序数组:
[a99.txt、b98.txt、b100.txt]

(使用字符串排序,排序结果为
[a99.txt、b100.txt、b99.txt]

以上假设您的文件总是被称为
name.####.txt
。对于真正的数字排序,请使用以下更复杂的版本:

public static void NumericalSort(string[] ar)
{
    Regex rgx = new Regex("([^0-9]*)([0-9]+)");
    Array.Sort(ar, (a, b) =>
    {
        var ma = rgx.Matches(a);
        var mb = rgx.Matches(b);
        for (int i = 0; i < ma.Count; ++i)
        {
            int ret = ma[i].Groups[1].Value.CompareTo(mb[i].Groups[1].Value);
            if (ret != 0)
                return ret;

            ret = int.Parse(ma[i].Groups[2].Value) - int.Parse(mb[i].Groups[2].Value);
            if (ret != 0)
                return ret;
        }

        return 0;
    });
}

static void Main(string[] args)
{
    string[] ar = new string[] { "a99.txt", "b98.txt", "b100.txt" };

    NumericalSort(ar);

    foreach (var a in ar)
        Console.WriteLine(a);
}
公共静态void NumericalSort(字符串[]ar)
{
正则表达式rgx=新正则表达式(“([^0-9]*)([0-9]+)”;
Array.Sort(ar,(a,b)=>
{
var ma=rgx.匹配项(a);
var mb=rgx.Matches(b);
对于(int i=0;i
这里可以找到一个解决方案:

很可能有一种管理的方法可以做到这一点,但我可能只需要p/invoke即可

如果您使用这个函数,而不是滚动您自己的比较函数,您将获得与使用逻辑比较的Explorer和其他系统组件相同的行为


但是请注意,这在WinAPI不可访问的环境(如Windows Phone、Mono或Silverlight)中不起作用,应该用注释进行修饰,以便将来的代码维护者知道为什么使用p/Invoke进行排序。

当数字块的长度不超过9位时,我的方法很好:

private string[] NumericalSort(IEnumerable<string> list)
{
    var ar = list.ToArray();

    Array.Sort(ar, (a, b) =>
    {
        var aa = Regex.Replace(a, @"\d+", m => m.Value.PadLeft(9, '0'));
        var bb = Regex.Replace(b, @"\d+", m => m.Value.PadLeft(9, '0'));
        
        return string.Compare(aa, bb);
    });

    return ar;
}
private string[]NumericalSort(IEnumerable列表)
{
var ar=list.ToArray();
Array.Sort(ar,(a,b)=>
{
var aa=Regex.Replace(a,@“\d+”,m=>m.Value.PadLeft(9,'0');
var bb=Regex.Replace(b,@“\d+”,m=>m.Value.PadLeft(9,'0');
返回字符串。比较(aa,bb);
});
返回ar;
}

您尝试过什么?显然,默认情况下,它会对字母数字进行排序,但您是否尝试过编写自定义比较器?您的问题令人困惑,因为您没有解释您得到了什么和想要得到什么。什么是“排序数组”,什么是“使用字符串排序的排序结果”?清楚地表达你的想法,你会得到很好的答案。字母数字排序是标准。。。我可能错了,但我认为这是个错误的术语。很好。我不知道调用存在。我不会使用WinAPI进行字符串比较。首先,它将代码绑定到一个非常特殊的平台(我这里甚至不是说Mono,比如Silverlight、windowsphone)。其次,我们甚至没有与Windows进行互操作。我了解调用WinAPI来处理复杂的角落案例,比如在Windows窗体中绘制窗口控件,或者做一些真正的低级工作。但是来吧,把字符串和WinAPI比较一下?作为一名.NET开发人员,我不知道strmplogicalw的作用是什么,甚至不知道我们想要的所有系统上是否都存在
shlwapi.dll
。我的基本意思是,通过使用这个调用,未来的开发人员有义务花10分钟的时间研究WinAPI文档(顺便说一句,它是C)当出现问题时(例如,函数结果可能取决于区域设置,某些系统上可能不存在库等),需要更多的时间来调试它。@David:当然。我只是想指出我认为这种方法的错误。为什么不在答案的编辑中添加这些点呢。这比否决票更有建设性。太棒了!但是,您对我的“示例2”的看法刚刚发布了一个真正数字排序的实现——它将涵盖您的第二个示例。“它的作用一点也不明显。”丹:有些人根本不喜欢它。首先,您抱怨自己无法在MSDN上查找内容。现在你抱怨不能理解.net实现。@David:是的,我是个挑剔的人。有时这会导致答案得到改进,我想这就是StackExchange评论的目的。在我看来,一个完美的答案应该包含一个名为
FilenameComparer
IComparer
实现,其中包含此代码。这将被证明是易于维护和稳定的。
[DllImport("shlwapi.dll", CharSet=CharSet.Unicode, ExactSpelling=true)]
static extern int StrCmpLogicalW(String x, String y);    
private string[] NumericalSort(IEnumerable<string> list)
{
    var ar = list.ToArray();

    Array.Sort(ar, (a, b) =>
    {
        var aa = Regex.Replace(a, @"\d+", m => m.Value.PadLeft(9, '0'));
        var bb = Regex.Replace(b, @"\d+", m => m.Value.PadLeft(9, '0'));
        
        return string.Compare(aa, bb);
    });

    return ar;
}