0

ページネーションの問題があります:

テーブルの結果として多数のページがあり、〜50.000ページであり、ページネーションロジックは次のようなものです: 1 2 3 ...50000 私は次のようなことをしたいと思います:

1 2 3 10 100 500 1000 5000 10000 50000

そして、たとえば 1111 をクリックすると:

1 1109 1110 1111 1112 1113 1114 1120 1200 1700 2200 3000 8000 10000 50000

これまでのところ、私は次のようなことを試しました:

int Max_count = (int)Math.Floor(Math.Log10(totalPages) + 1);
                    for (int index = start; index <= end; index++)
                    {
                        if (index == pageNumber)
                        {
                            header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.CurrentPage, pageNumber));
                        }
                        else if (index == start)
                        {
                            header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.StartPage, 0));
                        }
                        else if (index == end)
                        {
                            header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.EndPage, totalPages - 1));
                        }
                        else if ((index == start + 1) && (index > 1))
                        {
                            header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.MorePages, -1));
                        }
                        else if ((index == end - 1) && (index < totalPages - 2))
                        {
                            header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.MorePages, -1));
                        }
                        else if ((index > 100) && (index > totalPages / 2))
                        {
                            header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.SimplePage, index));
                        }
                        else if ((pageNumber + 2 > index) && index + 10 < totalPages && !isSecond)
                        {
                            for (int temp = 1; temp < Max_count; temp++)
                            {
                                int power_var = (int)Math.Pow(10, temp);
                                int power_var_prev = (int)Math.Pow(10, temp - 1);
                                if ((pageNumber > power_var) || pageNumber < 10)
                                {
                                    header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.SimplePage, power_var - 1));
                                    header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.SimplePage, power_var - 1 + power_var_prev));

                                    temp++;
                                }
                            }
                            isSecond = true;
                        }
                          else if (index - start < 3)
                        {
                            header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.SimplePage, index));
                        }

しかし、私はこれにまったく近づいていないように感じます。私は自分でこれを行うために使用できるヒントや公式の解決策を求めているわけではありません


後で編集

パターンは次のようになります。

n-3,                                  // 1         //1 
n-2,                                  // 2         //1109       
n-1,                                  // 3         //1110
**n**,                                // **4**     //1111
n+1,                                  //5          //1112
n+2,                                  //6          //1113
n+3,                                  //7          //1114
Math.Floor((index + 10)) / 10) * 10, //10          //1120
Math.Floor((index + 10)) / 10) * 10 +50, //60      //1170
Math.Floor((index + 100)) / 100) * 100, //100      //1200
Math.Floor((index + 100)) / 100) * 100+500,//600   //1700
Math.Floor((index + 1000)) / 1000) * 1000,//1000   //2000
Math.Floor((index + 1000)) / 1000) * 1000+5000,//6000/7000

....

4

1 に答える 1

2

目的の値を出力するコードを次に示します。

(1108も出力しますが、回避するのは簡単なはずです)

(+50、+500 などを +40、+400 などに変更しました)

int min = 1, max = 50000;

if (val-3 > min)
   Console.WriteLine(min);

for (int i = Math.Max(min, val-3); i <= Math.Min(max, val+3); i++)
   Console.WriteLine(i);

int last = -1;
for (int i = 10; ; i *= 10)
{
   int next = (val+3 + i) / i * i;
   if (next > max)
      break;
   // prevent printing something like 90, 130, 100, 500 (100 won't print)
   if (next > last)
      Console.WriteLine(next);
   next += 4*i;
   if (next > max)
      break;
   Console.WriteLine(next);
   last = next;
}

ライブデモ

値から最小値まで出力したい場合は、for ループをコピーして値を反転する単純なケースである可能性があります (最大値から値を出力します。これを変更するには、スタック データ構造が必要になります)。 )

for (int i = 10; ; i *= 10)
{
   int next = (val-3 - i) / i * i;
   if (next < min)
      break;
   if (next < last)
      Console.WriteLine(next);
   next -= 4*i;
   if (next < min)
      break;
   Console.WriteLine(next);
   last = next;
}
if (last != min)
   Console.WriteLine(min);

ここに別のアイデアがあります:

1111として取り上げ1..50000ます。

- の前の 2 つの値と後の 2 つの値を取得します1109, 1110, 1111, 1112, 1113

中間に 5 ポイントを置いて、目標に向かって指数関数的に成長させたいとしましょう。

上向きの値の範囲は次のようになります50000 - 1113 = 48887(上記の最大値から開始)。

x次に、そのようなを見つけたいと思います(5x)^2 = 48887。これはかなり簡単に計算できます。平方根 48887 を 5 で割るだけです。sqrt(48887) / 5 = 44.22

次に、値は次のようになります。

1113 + (1 * 44.22) ^ 2 = 3068
1113 + (2 * 44.22) ^ 2 = 8934
1113 + (3 * 44.22) ^ 2 = 18712
1113 + (4 * 44.22) ^ 2 = 32400
1113 + (5 * 44.22) ^ 2 = 50000

下向きも同様。

必要に応じて、ターゲットまでの距離に基づいて値の数を決めることができます。

より多くのラウンド数を希望する場合は、もう少し考えなければなりません.

于 2013-11-14T13:03:39.170 に答える