首页 > 后端开发 > C++ > 如何按字母顺序对字符串数组进行排序,同时对数值进行优先级排序?

如何按字母顺序对字符串数组进行排序,同时对数值进行优先级排序?

Patricia Arquette
发布: 2024-12-30 11:15:21
原创
542 人浏览过

How to Sort a String Array Alphabetically While Prioritizing Numerical Values?

在对字符串数组中的数值进行优先级排序的同时保持字母顺序

按字母顺序对字符串进行排序是一项标准任务,但是如何处理字符串的场景在保持数字顺序的同时也表示数字?这是解决此挑战的解决方案。

请考虑以下代码:

string[] things= new string[] { "105", "101", "102", "103", "90" };

foreach (var thing in things.OrderBy(x => x))
{
    Console.WriteLine(thing);
}
登录后复制

此代码尝试按字母顺序对数字字符串数组进行排序,但输出不符合预期:

101, 102, 103, 105, 90
登录后复制

要达到预期的输出:

90, 101, 102, 103, 105
登录后复制

你需要传递一个自定义的比较器进入 OrderBy。 Enumerable.OrderBy 允许您指定用于排序的自定义比较器。

这是使用 SemiNumericComparer 的实现:

string[] things = new string[] { "paul", "bob", "lauren", "007", "90" };

foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
{    
    Console.WriteLine(thing);
}
登录后复制

SemiNumericComparer 类定义了一个方法来确定字符串是否为数字,并提供比较方法:

public class SemiNumericComparer: IComparer<string>
{
    /// <summary>
    /// Method to determine if a string is a number
    /// </summary>
    /// <param name="value">String to test</param>
    /// <returns>True if numeric</returns>
    public static bool IsNumeric(string value)
    {
        return int.TryParse(value, out _);
    }

    /// <inheritdoc />
    public int Compare(string s1, string s2)
    {
        const int S1GreaterThanS2 = 1;
        const int S2GreaterThanS1 = -1;

        var IsNumeric1 = IsNumeric(s1);
        var IsNumeric2 = IsNumeric(s2);

        if (IsNumeric1 &amp;&amp; IsNumeric2)
        {
            var i1 = Convert.ToInt32(s1);
            var i2 = Convert.ToInt32(s2);

            if (i1 > i2)
            {
                return S1GreaterThanS2;
            }

            if (i1 < i2)
            {
                return S2GreaterThanS1;
            }

            return 0;
        }

        if (IsNumeric1)
        {
            return S2GreaterThanS1;
        }

        if (IsNumeric2)
        {
            return S1GreaterThanS2;
        }

        return string.Compare(s1, s2, true, CultureInfo.InvariantCulture);
    }
}
登录后复制

当应用于字符串数组时, SemiNumericComparer 首先按字母顺序排序字符串,然后按数值排序,提供所需的输出。

以上是如何按字母顺序对字符串数组进行排序,同时对数值进行优先级排序?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板