c# - 一种将字符串排序为另一个字符串的更简洁的方法

标签 c# string linq string-formatting

我有一个可能看起来像这样的字符串:“3, 7, 12-14, 1, 5-6”

我需要做的是将其更改为如下所示的字符串:“1, 3, 5, 6, 7, 12, 13, 14”

我已经使以下代码工作,但我非常感谢帮助如何用更少的代码行以更清晰的方式做到这一点:

private string sortLanes(string lanesString)
    {
        List<string> sortedLanes = new List<string>();

        if (lanesString.Contains(',') || lanesString.Contains('-'))
        {
            List<string> laneParts = lanesString.Split(',').ToList();

            foreach (string lanePart in laneParts)
            {
                if (lanePart.Contains('-'))
                {
                    int splitIndex = lanePart.IndexOf('-');
                    int lanePartLength = lanePart.Length;

                    int firstLane = Convert.ToInt32(lanePart.Substring(0, splitIndex));
                    int lastLane = Convert.ToInt32(lanePart.Substring(splitIndex + 1, lanePartLength - splitIndex - 1));
                    while (firstLane != lastLane)
                    {
                        sortedLanes.Add(firstLane.ToString().Trim());
                        firstLane++;
                    }
                    sortedLanes.Add(lastLane.ToString());
                }
                else
                {
                    sortedLanes.Add(lanePart.Trim());
                }
            }
            sortedLanes.Sort();
            sortedLanes = sortedLanes.OrderBy(x => x.Length).ToList();

            lanesString = "";
            foreach (string lane in sortedLanes)
            {
                if (lanesString.Length == 0)
                {
                    lanesString = lane;
                }
                else
                {
                    lanesString = lanesString + ", " + lane;
                }
            }
        }
        else
        {
            return lanesString;
        }
        return lanesString;
    }

最佳答案

我会先按 , 拆分,然后将每个值转换为单个整数或所需的范围。获取结果并对它们重新排序,然后连接回一个字符串。像这样。

    string test = "3, 7, 12-14, 1, 5-6";
    var items = test.Split(',');
    var ints = items.SelectMany(item => Expand(item));
    string result = string.Join(", ", ints.OrderBy(i => i).ToArray());


    private static IEnumerable<int> Expand(string str)
    {
        if (str.Contains('-'))
        {
            var range = str.Split('-');
            int begin = int.Parse(range[0]);
            int end = int.Parse(range[1]);
            for (int i = begin; i <= end; i++)
                yield return i;
        }
        else
            yield return int.Parse(str);
    }

当然你可能想添加一些错误检查,但我会把它留给你。

关于c# - 一种将字符串排序为另一个字符串的更简洁的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13823433/

相关文章:

c# - 如何在 C# 中使用 XMLREADER 从 XML 字符串中读取特定元素

c++ - 以相反顺序打印字符串输入

Java - 在两个字符串之间切换

c# - FindAll 和 Select 有什么区别?

c# - 如何声明 Linq 表达式变量以便将其作为 dbParameter 处理

c# - 导入 .png 文件运行时 Unity Android

c# - EF6 重试过程为 SqlQuery 命令抛出 "The SqlParameter is already contained by another SqlParameterCollection"

c# - 自定义验证属性的依赖注入(inject)

c - 从链表中删除字符串 - C

c# - 可查询属性不明确引用错误