C# に次の文字列があります。
string a="1,2,3,4,5,6,7,8,9,10,22,45,66,88,100,101,102,103,104,105,140,199";
次の出力を生成したいと思います。
1-10,22,45,66,88,100-105,140,199 連続する数字をこのように範囲にグループ化する
"initialnumber-endnumber" を指定し、他はそのままにします。
これについて手を貸してもらえますか?
前もって感謝します。
C# に次の文字列があります。
string a="1,2,3,4,5,6,7,8,9,10,22,45,66,88,100,101,102,103,104,105,140,199";
次の出力を生成したいと思います。
1-10,22,45,66,88,100-105,140,199 連続する数字をこのように範囲にグループ化する
"initialnumber-endnumber" を指定し、他はそのままにします。
これについて手を貸してもらえますか?
前もって感謝します。
IEnumerable<string> Rangify(IList<int> input) {
for (int i = 0; i < input.Count; ) {
var start = input[i];
int size = 1;
while (++i < input.Count && input[i] == start + size)
size++;
if (size == 1)
yield return start.ToString();
else if (size == 2) {
yield return start.ToString();
yield return (start + 1).ToString();
} else if (size > 2)
yield return start + " - " + (start + size - 1);
}
}
わかりました、最初のステップ、文字列を順序付き整数として列挙します。
var numbers = a.Split(',').Select(int.Parse()).OrderBy(i => i);
したがって、これら 2 つの関数を使用して、このように範囲を列挙できます。
private static string RangeToString(int first, int last)
{
if ( last != first )
{
return string.Format("{0}-{1}", first, last);
}
else
{
return last.ToString();
}
}
private static IEnumerable<string> GetRanges(IEnumerable<int> numbers)
{
var last = numbers.First();
var first = last;
foreach(var number in numbers.Skip(1))
{
if (lastNumber + 1 != number)
{
yield return RangeToString(first, last);
first = number;
}
last == number;
}
yield return RangeToString(first, last);
}
そしたらこんな感じにまとめられる
public static string GetRangedList(string list)
{
var numbers = list.Split(',').Select(int.Parse()).OrderBy(i => i);
return string.Join(",", GetRanges(numbers));
}
明らかにあなたはこのように呼ぶでしょう
var b = GetRangedList(a);