2

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" を指定し、他はそのままにします。

これについて手を貸してもらえますか?

前もって感謝します。

4

2 に答える 2

4
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);
    }
}
于 2012-08-14T16:38:31.540 に答える
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);
于 2012-08-14T16:59:55.667 に答える