求,用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);
}
}
}