Sankar M
Sankar M

Reputation: 4779

Need to convert Range of number notation into Comma separated values?

My input would be

string PageRange = "1,2-5,9";

and i need to convert them into

string TotalRange = "1,2,3,4,5,9";

pls share your ideas.

Upvotes: 0

Views: 1390

Answers (3)

paramjeet singh
paramjeet singh

Reputation: 165

Try

var result = "";
var aray = PageRange.Split(',').ToArray();
foreach (var item in aray)
{
    if (item.IndexOf('-') != -1)
    {
        var splitparts = item.Split('-');
        result= Enumerable.Range(Convert.ToInt32(item.Split('-')[0]), (Convert.ToInt32(item.Split('-')[1]) - Convert.ToInt32(item.Split('-')[0]))).Aggregate((a, b) => a.ToString() + "," + b.ToString());
    }

    if (result.Equals(""))
    {
        result = item;
    }
    else
    {
        result += "," + item;
    }
}

Upvotes: -1

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236208

Non-LINQ solution: Following method processes input string and replaces ranges with sequence of numbers:

static IEnumerable<int> RangeToSequence(string input)
{            
    string[] parts = input.Split(',');
    foreach (var part in parts)
    {
        if (!part.Contains('-')) // simple number, just return it
        {
            yield return Int32.Parse(part);
            continue;
        }
        // otherwise we have range
        string[] rangeParts = part.Split('-');
        int start = Int32.Parse(rangeParts[0]);
        int end = Int32.Parse(rangeParts[1]);

        while (start <= end)
        {
            yield return start; 
            start++;
        }
    }
}

You can create string:

var result = String.Join(",", RangeToSequence(PageRange));

Linq solution: you can treat simple numbers as ranges with start only. So, you can use SelectMany to select range from each part:

var numbers = from part in PageRange.Split(',')
              let range = part.Split('-')
              let start = Int32.Parse(range[0])
              let end = Int32.Parse(range[range.Length - 1])
              from i in Enumerable.Range(start, end - start + 1)
              select i;

string result = String.Join(",", numbers);

Upvotes: 10

Hossain Muctadir
Hossain Muctadir

Reputation: 3626

            List<string> result = new List<string>();
            string PageRange = "1,2-5,9";
            var strings = PageRange.Split(',');
            foreach (var s in strings)
            {
                var split = s.Split('-');
                if (split.Count() == 1)
                {
                    result.Add(s);
                    continue;
                }

                for (int i = int.Parse(split[0]); i <= int.Parse(split[1]); i++)
                {
                    result.Add(i.ToString());
                }
            }

Upvotes: 0

Related Questions