代码改变世界

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

  Nana's Lich  阅读(394)  评论(0编辑  收藏  举报

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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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 -结束页码附近的页码应该怎么样表现

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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();
}

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示