private static IEnumerable<int> PageList(int total, int current)
{
var pages = new List<int>();
var midStack = new List<int>();
// should be more then 4
const int MaxPages = 12;
if (MaxPages > total)
{
for (var i = 1; i <= total; i++)
{
pages.Add(i);
}
}
else
{
const int Midle = (MaxPages - 4) / 2;
// always show first two
pages.Add(1);
pages.Add(2);
for (var i = current - Midle; i <= (current + Midle); i++)
{
if (i > 2 && i < (total - 1))
{
midStack.Add(i);
}
}
// pad to the end if less than needed
if (midStack.Count < (MaxPages - 2))
{
var last = int.Parse(midStack[midStack.Count - 1].ToString());
for (var j = last + 1; j <= (MaxPages - 2); j++)
{
midStack.Add(j);
}
}
// pad in the beginning if needed
if (midStack.Count < (MaxPages - 4))
{
midStack.Clear();
for (var k = total - MaxPages + 3; k <= (total - 2); k++)
{
midStack.Add(k);
}
}
if (int.Parse(midStack[0].ToString()) > 3)
{
pages.Add(0);
}
pages.AddRange(midStack.Select(p => int.Parse(p.ToString())));
if (int.Parse(midStack[midStack.Count - 1].ToString()) < (total - 2))
{
pages.Add(0);
}
// always show last two
pages.Add(total - 1);
pages.Add(total);
}
return pages;
}