public string Format(IEnumerable<UniqueChange> changes)
{
var changeList = changes.ToList();
if (!changeList.Any())
{
return " (none)";
}
StringBuilder builder = new StringBuilder();
int? lastRangeStart = null;
int? lastNumber;
var changesByFolder = changeList.GroupBy(c => c.Folder).ToList();
bool isFirst;
foreach (var group in changesByFolder)
{
AppendFolder(builder, group.Key);
isFirst = true;
lastNumber = null;
foreach (var thisNumber in group.Select(c => c.ScriptNumber))
{
if (!lastNumber.HasValue)
{
// first in loop
lastNumber = thisNumber;
lastRangeStart = thisNumber;
}
else if (thisNumber == lastNumber + 1)
{
// continuation of current range
lastNumber = thisNumber;
}
else
{
// doesn't fit into last range - so output the old range and
// start a new one
AppendRange(builder, lastRangeStart.Value, lastNumber.Value, isFirst);
isFirst = false;
lastNumber = thisNumber;
lastRangeStart = thisNumber;
}
}
this.AppendRange(builder, lastRangeStart.Value, lastNumber.Value, isFirst);
}
return builder.ToString();
}