Этот вопрос в значительной степени противоположный этому вопросу: Имеет ли С# встроенную поддержку для разбора строк номера страницы?
Итак, данный
1,3,5,6,7,8,9,10,12:
Я выйду:
1,3,5-10,12
Вот моя первая попытка. Кажется, это хаки и, вероятно, самый худший код, который я когда-либо писал. Можете ли вы предложить импотенцию\лучший способ сделать это?
static string numListToRangeStr(List<int> numList)
{
StringBuilder retString = new StringBuilder();
numList.Sort();
bool inRangeFind = false;
int firstInRange = numList[0];
int lastNumber = firstInRange;
bool first = true;
for (int i = 1; i < numList.Count; i++)
{
if (numList[i] == (lastNumber + 1))
{
inRangeFind = true;
}
else
{
if (inRangeFind)
{
if (!first)
{
retString.Append(",");
}
retString.Append(firstInRange);
retString.Append("-");
}
else
{
if (!first)
{
retString.Append(",");
}
}
retString.Append(lastNumber);
firstInRange = numList[i];
inRangeFind = false;
first = false;
}
lastNumber = numList[i];
}
if (inRangeFind)
{
if (!first)
{
retString.Append(",");
}
retString.Append(firstInRange);
retString.Append("-");
}
else
{
if (!first)
{
retString.Append(",");
}
}
retString.Append(lastNumber);
return retString.ToString();
}