【问题标题】:C# Regex sorting letter and number stringsC# 正则表达式排序字母和数字字符串
【发布时间】:2009-03-25 08:35:25
【问题描述】:

我有一个需要订购的清单:

R1-1
R1-11
R2-2
R1-2

这需要订购:

R1-1
R1-2
R1-11
R2-2

目前我正在使用 C# Regex.Replace 方法并在字符串末尾出现单个数字之前添加一个 0,例如:

Regex.Replace(inString,@"([1-9]$)", @"0$2")

我确信有一个更好的方法可以做到这一点,我只是想不通。 有没有人用正则表达式对字母和数字字符串进行排序的好方法?


我已经使用下面 Greg 的方法来完成此操作,只是认为我应该添加我正在使用的代码以确保完整性:

public static List<Rack> GetRacks(Guid aisleGUID)
    {
        log.Debug("Getting Racks with aisleId " + aisleGUID);
        List<Rack> result = dataContext.Racks.Where(
                               r => r.aisleGUID == aisleGUID).ToList();
        return result.OrderBy(r => r.rackName, new NaturalStringComparer()).ToList();
    }

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    我认为您所追求的是自然排序顺序,就像 Windows 资源管理器一样?如果是这样,那么我不久前写了一篇博客文章,显示how you can achieve this in a few lines of C#

    注意:我刚刚检查并在链接条目中使用 NaturalStringComparer 确实会返回您正在查找的带有示例字符串的顺序。

    【讨论】:

    • 很好的答案格雷格!我现在已经使用了这个解决方案,并将添加我在我的问题中使用的方法以确保完整性。
    • 是的,伟大的格雷格!太糟糕了,链接已经死了
    • @Scott - 对此感到抱歉。我简化了博客上的链接,一些重定向似乎无法正常工作。我已经编辑了帖子以获得更新的链接。
    【解决方案2】:

    您可以编写自己的比较器并使用正则表达式先比较“R”和“-”之间的数字,然后再比较“-”后面的数字,如果第一个数字相等。

    草图:

    public int Compare(string x, string y)
    {
        int releaseX = ...;
        int releaseY = ...;
        int revisionX = ...;
        int revisionY = ...;
    
        if (releaseX == releaseY)
        {
            return revisionX - revisionY;
        }
        else
        {
            return releaseX - releaseY;
        }
    }
    

    【讨论】:

    • 编辑:嗯.. Greg Beech 的解决方案很好! -- 因此,如果您想避免使用 DllImport,请将此作为解决问题的方法。
    • 感谢您的回复!我使用了 Greg 的解决方案,但很高兴有这个供其他人参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多