还有1-3,5,7-10这样类似的字符串呢

求,用C#如何把1-4,6变成1,2,3,4,6?还有1-3,5,7-10这样类似的字符串呢?

string s = "1-4,6";
string[] arr = s.split(',');
List<int> list = new List<int>();
foreach (string i in arr)
{
if (i.Contains("-"))
{
for (int x = Convert.ToInt32(i.split('-')[0]); x <= Convert.ToInt32(i.split('-')[1]); x++) list.Add(x);
}
else
list.Add(Convert.ToInt32(i));
}

手写的,你参考下

楼上贴了很多,我来贴一单次循环+状态机的

string str2 = "1-3,5,7-10";

var test =string.Join(",",ExpandRange(str2.AsMemory())) ;


IEnumerable<string> ExpandRange(ReadOnlyMemory<char> source)
{
    IEnumerable<string> lst = Enumerable.Empty<string>();
    var tsoure = new ReadOnlySequence<char>(source);
    Stack<ReadOnlySequence<char>> stack = new Stack<ReadOnlySequence<char>>();
    SequenceReader<char> reader = new SequenceReader<char>(tsoure);
    while (reader.TryRead(out var c))
    {
        if (c.Equals(','))
        {
            tsoure = tsoure.Slice(reader.Position);
          lst=  lst.Concat(makestring(stack).ToList());

        }
        else if (c.Equals('-'))
        {
            var b = tsoure.Slice(tsoure.Start, reader.Position);
            stack.Push(b);
            tsoure = tsoure.Slice(reader.Position);
        }
        else
        {
            var b = tsoure.Slice(tsoure.Start, reader.Position);
            stack.TryPop(out var op);
            stack.Push(b);
        }

    }
    lst=  lst.Concat(makestring(stack).ToList());

    IEnumerable<string> makestring( Stack<ReadOnlySequence<char>> stack)
    {
        if (stack.Count == 0) yield break;
        if (stack.Count == 1)
        {
            yield return stack.Pop().ToString();
            yield break;
        }

        var op1 = stack.Pop();
        var op2 = stack.Pop();

        int i = Convert.ToInt32(op1.ToString());
        int j = Convert.ToInt32(op2.ToString());
        foreach (var i1 in Enumerable.Range(j, i-j+1))
        {
            yield return i1.ToString();
        }
    }
    return lst;
}

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class Program
{
    static void Main(string[] args)
    {
        string str1 = "1-4,6";
        string str2 = "1-3,5,7-10";

        List<int> list1 = ExpandString(str1);
        List<int> list2 = ExpandString(str2);

        Console.WriteLine("str1: " + string.Join(",", list1));
        Console.WriteLine("str2: " + string.Join(",", list2));
    }

    static List<int> ExpandString(string str)
    {
        List<int> result = new List<int>();

        string[] segments = str.Split(',');
        foreach (string segment in segments)
        {
            if (segment.Contains("-"))
            {
                // 处理范围
                Match match = Regex.Match(segment, @"(\d+)-(\d+)");
                if (match.Success)
                {
                    int start = int.Parse(match.Groups[1].Value);
                    int end = int.Parse(match.Groups[2].Value);

                    for (int i = start; i <= end; i++)
                    {
                        result.Add(i);
                    }
                }
            }
            else
            {
                // 处理单个数字
                result.Add(int.Parse(segment));
            }
        }

        return result;
    }
}

该回答引用GPTᴼᴾᴱᴺᴬᴵ
可以使用C#的字符串处理和正则表达式来实现将类似"1-4,6"的字符串转换成"1,2,3,4,6"的形式。

下面是一个示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "1-4,6";
            string output = ExpandRange(input);

            Console.WriteLine(output);
            // 输出:1,2,3,4,6
        }

        static string ExpandRange(string input)
        {
            string[] ranges = input.Split(',');

            List<int> numbers = new List<int>();
            foreach (string range in ranges)
            {
                Match match = Regex.Match(range, @"^(\d+)-(\d+)$");
                if (match.Success)
                {
                    int start = int.Parse(match.Groups[1].Value);
                    int end = int.Parse(match.Groups[2].Value);
                    numbers.AddRange(Enumerable.Range(start, end - start + 1));
                }
                else if (int.TryParse(range, out int number))
                {
                    numbers.Add(number);
                }
            }

            return string.Join(",", numbers);
        }
    }
}


对于类似"1-3,5,7-10"的字符串,也可以使用类似的方法处理,代码示例如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "1-3,5,7-10";
            string output = ExpandRange(input);

            Console.WriteLine(output);
            // 输出:1,2,3,5,7,8,9,10
        }

        static string ExpandRange(string input)
        {
            string[] ranges = input.Split(',');

            List<int> numbers = new List<int>();
            foreach (string range in ranges)
            {
                Match match = Regex.Match(range, @"^(\d+)-(\d+)$");
                if (match.Success)
                {
                    int start = int.Parse(match.Groups[1].Value);
                    int end = int.Parse(match.Groups[2].Value);
                    numbers.AddRange(Enumerable.Range(start, end - start + 1));
                }
                else if (int.TryParse(range, out int number))
                {
                    numbers.Add(number);
                }
                else
                {
                    throw new ArgumentException($"Invalid range format: {range}");
                }
            }

            return string.Join(",", numbers);
        }
    }
}