代码改变世界

一个显示页码用的helper。。。

2010-07-08 15:50  Nana's Lich  阅读(394)  评论(0编辑  收藏  举报

没想到这么不起眼的东西杀了我不少脑细胞……

在控制台中测试没发现啥问题,代码风格什么的就先不管它了

 

public static class PageNumExt
{
  public delegate void ToDo(long i);
  public delegate void PadToDo();

  public static void GeneratePageNum(this object o,
    long curr, ToDo cfixToDo, PadToDo padToDo, long fixLen = 2, long padding = 1)
  {
    o.GeneratePageNum(curr, cfixToDo, cfixToDo, padToDo, fixLen, padding);
  }
  public static void GeneratePageNum(this object o,
    long curr, ToDo currTodo, ToDo cfixToDo, PadToDo padToDo, long fixLen = 2, long padding = 1)
  {
    GeneratePageNum(o,
      curr, currTodo,
      1, long.MaxValue,
      cfixToDo, i => { },
      fixLen, cfixToDo,
      padding, padToDo,
      fixLen, curr,
      cfixToDo, i => { }
      );
  }
  public static void GeneratePageNum(this object o,
    long curr, ToDo currToDo,
    long begin, long end,
    ToDo beginToDo, ToDo endToDo,
    long cfix, ToDo cfixToDo,
    long padding, PadToDo padToDo,
    long sfixBegin, long pfixEnd,
    ToDo sfbToDo, ToDo pfeToDo
    )
  {
    long i = begin;

    if (begin < curr)
    {
      beginToDo(begin);

      i++;

      var g1 = i + sfixBegin;
      var g3 = curr - cfix;
      var g2 = g3 - padding;

      if (g1 > g3)
        g1 = g3;

      for (; i < g1; i++)
        sfbToDo(i);

      if (i < g2)
      {
        padToDo();
        i = g2 + 1;
      }
      else
        for (; i < g3; i++)
          cfixToDo(i);
    }

    for (; i < curr; i++)
      cfixToDo(i);

    currToDo(curr);
    i = curr + 1;

    var g = i + cfix;
    if (g > end)
      g = end;
    for (; i < g; i++)
      cfixToDo(i);

    if (end > curr)
    {
      var g1 = end - pfixEnd;
      var g2 = g1 - padding;

      if (g < g2)
        padToDo();
      else
        for (; i < g1; i++)
          cfixToDo(i);

      if (i < g1)
        i = g1;

      for (; i < end; i++)
        pfeToDo(i);
      endToDo(end);
    }


  }
}
参数解说:

curr - 当前页码

currToDO - 怎样输出当前页码

begin - 页码从多少开始

end - 页码到多少结束

beginToDo - 怎样显示起始页码

endToDo - 怎样显示结束页码

cfix - 当前页的前后页码输出多少个

cfixToDo - 当前页前后页码怎样输出

padding - 所有没有被涵盖进其它参数的页码,如果出现次数超过这个参数的值,则完全省略掉

padToDo - 被省略掉的页码应该怎样表现

sfixBegin - 从起始页码开始,延伸显示多少个页码

pfixEnd - 到结束页码位置,延伸显示多少个靠近结束位置的页码

sfbToDo - 起始页码附近的页码应该怎么样表现

pfeToDo -结束页码附近的页码应该怎么样表现

 

测试用的控制台程序代码:

for (var j = 1; j < 20; j++)
{
  args.GeneratePageNum(j, i =>
        {
          Console.Write('[');
          Console.Write(i);
          Console.Write(']');
          Console.Write(' ');
        },
        2, 18,
        i =>
        {
          Console.Write('<');
          Console.Write(i);
          Console.Write(' ');
        },
        i =>
        {
          Console.Write(i);
          Console.Write('>');
        },
        2, i =>
        {
          Console.Write('#');
          Console.Write(i);
          Console.Write(' ');
        },
        1, () => Console.Write(".. "),
        2, 2, i =>
        {
          Console.Write('[');
          Console.Write(i);
          Console.Write(' ');
        }, i =>
        {
          Console.Write(i);
          Console.Write(']');
          Console.Write(' ');
        });

  Console.WriteLine();
}

for (var j = 1; j < 10; j++)
{
  args.GeneratePageNum(j, i =>
  {
    Console.Write('[');
    Console.Write(i);
    Console.Write(']');
    Console.Write(' ');
  }, i =>
  {
    Console.Write(i);
    Console.Write(' ');
  }, () =>
  {
    Console.Write(".. ");
  }, 2, 1);

  Console.WriteLine();
}