c# - 自定义数组排序

标签 c# .net arrays

我的数组中的每个项目/字符串都以两个字母开头,后跟两个或三个数字,有时还会跟另一个字母。

示例,RS01 RS10 RS32A RS102 RS80 RS05A RS105A RS105B

我尝试使用默认的 Array.Sort 对其进行排序,但它返回了这个...

RS01
RS05A
RS10
RS102
RS105A
RS105B
RS32A
RS80

但是我需要这样的..

RS01
RS05A
RS10
RS32A
RS80
RS102
RS105A
RS105B

有什么想法吗?

最佳答案

这是使用自定义比较委托(delegate)和正则表达式进行排序:

string[] array = { "RS01", "RS10", "RS32A", "RS102", 
                   "RS80", "RS05A", "RS105A", "RS105B" };

Array.Sort(array, (s1, s2) =>
    {
        Regex regex = new Regex(@"([a-zA-Z]+)(\d+)([a-zA-Z]*)");
        var match1 = regex.Match(s1);                                        
        var match2 = regex.Match(s2);

        // prefix
        int result = match1.Groups[1].Value.CompareTo(match2.Groups[1].Value);
        if (result != 0)
            return result;

        // number 
        result = Int32.Parse(match1.Groups[2].Value)
                        .CompareTo(Int32.Parse(match2.Groups[2].Value));

        if (result != 0)
            return result;

        // suffix
        return match1.Groups[3].Value.CompareTo(match2.Groups[3].Value);
    });

更新(少量重构,并将所有内容移动到单独的比较器类)。用法:

Array.Sort(array, new RSComparer());

比较器本身:

public class RSComparer : IComparer<string>
{
    private Dictionary<string, RS> entries = new Dictionary<string, RS>();

    public int Compare(string x, string y)
    {
        if (!entries.ContainsKey(x))
            entries.Add(x, new RS(x));

        if (!entries.ContainsKey(y))
            entries.Add(y, new RS(y));

        return entries[x].CompareTo(entries[y]);
    }

    private class RS : IComparable
    {
        public RS(string value)
        {
            Regex regex = new Regex(@"([A-Z]+)(\d+)([A-Z]*)");
            var match = regex.Match(value);
            Prefix = match.Groups[1].Value;
            Number = Int32.Parse(match.Groups[2].Value);
            Suffix = match.Groups[3].Value;
        }

        public string Prefix { get; private set; }
        public int Number { get; private set; }
        public string Suffix { get; private set; }

        public int CompareTo(object obj)
        {
            RS rs = (RS)obj;
            int result = Prefix.CompareTo(rs.Prefix);
            if (result != 0)
                return result;

            result = Number.CompareTo(rs.Number);
            if (result != null)
                return result;

            return Suffix.CompareTo(rs.Suffix);
        }
    }
}

关于c# - 自定义数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15013050/

相关文章:

Azure DevOps 中带有图像的 C# NuGet 包错误

c# - Entity Framework 上的多态交叉关联

c++ - 逐元素移动第一个元素指向的数组的函数

c# - 添加具有一对一子项的父项实例

c# - 如何获取xamarin.android中的音乐文件夹路径?

.net - 使用 Lutz 反射器查看 IL 代码

c# - 各种对象的可重复逻辑

c# - C# 中的字符串到字典或数组

java - 如何查找二维数组(矩形矩阵)是否有一条直线

c# - 如何使用 ServiceStack.Redis 库从 Redis 流读取值?