在c#中,可以使用linq的 skip 和 take 方法组合来实现数组的分页读取。具体做法是调用 skip((pageindex - 1) * pagesize) 跳过前面的元素,再调用 .take(pagesize) 获取当前页的数据,最后通过 .toarray() 或 .tolist() 将结果转换回数组或列表。这种操作基于内存中的集合,适用于数据量较小的场景。

Skip 和 Take 的具体执行逻辑是什么
Skip 会忽略前 N 个元素,而 Take 只取接下来的 M 个元素。当两者链式调用时,系统会先计算偏移量,然后按顺序提取数据。如果索引超出范围,Skip 返回空序列,Take 也会相应返回空或少量数据,不会抛出异常。

using System;
using System.Linq;
class Program
{
static void Main()
{
int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int pageIndex = 2; // 第2页
int pageSize = 3; // 每页3条
var pageData = numbers.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToArray();
Console.WriteLine(string.Join(", ", pageData));
}
}
// 输出: 3, 4, 5如何计算总页数并处理边界情况
计算总页数通常使用 (total + pageSize - 1) / pageSize 的整数除法公式。在处理边界情况时,如果请求的页码大于总页数,Skip 会跳过所有元素,导致结果为空,这符合预期行为。开发者应在使用前校验页码有效性,避免无效查询。

using System;
using System.Linq;
class Program
{
static void Main()
{
int[] data = { 10, 20, 30, 40, 50 };
int totalItems = data.Length;
int pageSize = 2;
int totalPages = (totalItems + pageSize - 1) / pageSize;
Console.WriteLine($"总页数: {totalPages}");
// 模拟请求第3页(存在)
int page3 = 3;
var result3 = data.Skip((page3 - 1) * pageSize).Take(pageSize).ToArray();
Console.WriteLine($"第{page3}页: {string.Join(", ", result3)}");
// 模拟请求第4页(超出)
int page4 = 4;
var result4 = data.Skip((page4 - 1) * pageSize).Take(pageSize).ToArray();
Console.WriteLine($"第{page4}页: {(result4.Length == 0 ? "(空)" : string.Join(", ", result4))}");
}
}当输入数组为空时会发生什么
当输入数组为空时,Skip 和 Take 的组合操作会直接返回一个空序列。无论页码和页大小如何设置,只要源集合没有元素,最终结果就是空的数组或列表。这种行为是安全的,不会引发 ArgumentOutOfRangeException 或其他异常,适合用于空数据的分页展示。


















