c# 对不同格式的字符串进行排序

标签 c# .net linq

我有返回到 UI 的车牌号,我希望它们按升序排列:

假设输入如下:

1/12/13/2
1/12/11/3
1/12/12/2
1/12/12/1

我的预期输出是:

1/12/11/3
1/12/12/1
1/12/12/2
1/12/13/2

我目前正在执行此操作的代码是:

var orderedData = allLicenceNumbers
   .OrderBy(x => x.LicenceNumber.Length)
   .ThenBy(x => x.LicenceNumber)
   .ToList();

但是对于另一个输入示例如下:

4/032/004/2
4/032/004/9
4/032/004/3/A
4/032/004/3/B
4/032/004/11

我正在获取返回的数据:

4/032/004/2
4/032/004/9
4/032/004/11
4/032/004/3/A
4/032/004/3/B

当我需要的是:

4/032/004/2
4/032/004/3/A
4/032/004/3/B
4/032/004/9
4/032/004/11

有没有更好的方法我可以简单地订购它以在两个样本输入中给出正确的结果,或者我是否需要编写自定义排序?

编辑

它不会始终是字符串中的相同元素。

这可能是示例输入:

2/3/5/1/A
1/4/6/7
1/3/8/9/B
1/3/8/9/A
1/5/6/7

预期输出为:

1/3/8/9/A
1/3/8/9/B
1/4/6/7
1/5/6/7
2/3/5/1/A

最佳答案

您应该拆分您的数字并将每个部分相互比较。按值比较数字和按字典顺序比较字符串。

var licenceNumbers = new[]
{
    "4/032/004/2",
    "4/032/004/9",
    "4/032/004/3",
    "4/032/004/3/A",
    "4/032/004/3/B",
    "4/032/004/11"
};

var ordered = licenceNumbers
    .Select(n => n.Split(new[] { '/' }))
    .OrderBy(t => t, new LicenceNumberComparer())
    .Select(t => String.Join("/", t));

使用以下比较器:

public class LicenceNumberComparer: IComparer<string[]>
{ 
    public int Compare(string[] a, string[] b)
    {
        var len = Math.Min(a.Length, b.Length);
        for(var i = 0; i < len; i++)
        {
            var aIsNum = int.TryParse(a[i], out int aNum);
            var bIsNum = int.TryParse(b[i], out int bNum);
            if (aIsNum && bIsNum)
            {
                if (aNum != bNum)
                {
                    return aNum - bNum;
                }
            }
            else
            {
                var strCompare = String.Compare(a[i], b[i]);
                if (strCompare != 0)
                {
                    return strCompare;
                }
            }
        }
        return a.Length - b.Length;
    }
}

关于c# 对不同格式的字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47532158/

相关文章:

c# - 使用c#实现activeX控件在Windows窗体中查看PowerPoint幻灯片,不显示控件

c# - 在wpf中获取选定的单选按钮

c# - 空传播运算符

c# - 使用 LINQ 将嵌套循环展平为一个列表

c# - Action 的通用约束没有按预期工作

c# - 起订量 : FileNotFoundException: Could not load file or assembly 'System.Runtime'

c# - 什么时候应该使用 ThrowHelper 方法而不是直接抛出?

c# - 查找格式正确的括号的所有组合

c# - 使用 LINQ 进行宽容/模糊搜索

c# - 来自 LINQ Query for SqlBulkCopy 的 Datareader