C# 如何在列表上应用分页

C# 如何在列表上应用分页,c#,list,C#,List,我有一个从数据库中检索数据并将其添加到列表中的函数。我的列表已经准备好并显示了数据,但我希望对该列表进行分页,以便每页显示有限的记录。但我不知道该怎么做。 这是我的数据层函数代码 public List<demodto> executereader(List<demodto> Ldemo,SqlCommand cmdshow, string tablename) { SqlConnection cn; try

我有一个从数据库中检索数据并将其添加到列表中的函数。我的列表已经准备好并显示了数据,但我希望对该列表进行分页,以便每页显示有限的记录。但我不知道该怎么做。 这是我的数据层函数代码

 public List<demodto> executereader(List<demodto> Ldemo,SqlCommand cmdshow, string tablename)
    {
         SqlConnection cn;
         try
         {
             cn = this.getconnection();

             cmdshow.Connection = cn;
             cn.Open();

             SqlDataReader rd = cmdshow.ExecuteReader();
             while (rd.Read())
             {
                 demodto dtoobj1 = new demodto();
                 dtoobj1.ID = Convert.ToInt32(rd[0].ToString());
                 dtoobj1.Name = rd[1].ToString();
                 dtoobj1.PhNo = Convert.ToInt32(rd[2].ToString());
                 dtoobj1.Address = rd[3].ToString();
                 dtoobj1.Gender = rd[4].ToString();
                 dtoobj1.Email = rd[5].ToString();
                 dtoobj1.Emptype = rd[6].ToString();

                 Ldemo.Add(dtoobj1);

             }
             cn.Close();
             return Ldemo;
         }
         catch (Exception ex2)
         {
             throw new DataException("error....." + ex2.Message);

         }

    }
请帮帮我。谢谢

_context.skip(5).take(10)
试着用这个。这个问题的更好解释和扩展方法符合您的需要。我不知道您的页面结构如何,但您可以使用一个简单的for循环来获得如下值:

int recordPerPage = 20;
for(int i=0; i<pageCount; i++)
{ 
   var values = list.Skip(recordPerPage*i).Take(recordPerPage).ToList();
   // add values to the page or display whatever..
}
IList<demodto> GetPage(IList<demodto> list, int page, int pageSize) {
    return list.Skip(page*pageSize).Take(pageSize).ToList();
}

您可以使用LINQ分页列表,如下所示:

int recordPerPage = 20;
for(int i=0; i<pageCount; i++)
{ 
   var values = list.Skip(recordPerPage*i).Take(recordPerPage).ToList();
   // add values to the page or display whatever..
}
IList<demodto> GetPage(IList<demodto> list, int page, int pageSize) {
    return list.Skip(page*pageSize).Take(pageSize).ToList();
}
例如,假设每个页面有50条记录。要获得第三页,请致电

IList<demodto> thirdPage = GetPage(dataList, 3, 50);
但是,请注意,对内存中的数据应用分页几乎没有意义:分页背后的想法是减少从数据库检索数据所需的时间,并通过只保留一个页面来节省一些内存,这在您的情况下是不会发生的,因为所有数据都是一次性检索的


为了使分页值得付出努力,您需要将其移动到数据库中。更改方法以接受页面大小和编号,并使用它们更改SQL以检索单个页面的列表。不要忘记对sql读取强制排序,否则相同的数据可能会出现在不同的页面上。需要修改SQL以支持分页。这取决于您的数据库。介绍了MS SQL Server解决方案。

在新版本的SQL Server中,您可以使用ROWNUMBER函数

rowStart    = ((Page - 1) * PageSize) + 1
rowEnd      = Page * PageSize

SELECT * From (SELECT ROW_NUMBER() {0} As RowNum, * FROM table WHERE condition) AS RowConstrainedResult Where RowNum >= rowStart And RowNum <= rowEnd Order By RowNum

这会使整个过程更快,因为您不会返回整个数据集,而只是返回页面上您想要的记录

是否应该是返回列表。Skippage-1*pageSize.TakepageSize.ToList@SAKET取决于您考虑的是基于页面的还是基于零的。我更喜欢以零为基础的编号。谢谢你提供的信息。@dasblinkenlight你知道如何通过LINQ知道给定集合长度的总页数吗?@Roel,我来晚了一点,但你可以使用:int result=Math.DivRemint a,int b,out new int restins;如果余数大于0,则在结果中添加一个商,这就是总页数。可能重复的
int pagesize = 1000;
int countitens = list1.Count();
int pagecount = countitens % pagesize <= 0 ? countitens / pagesize : (countitens / pagesize) + 1; // for example 10001 itens and page size of 1000 retusn 2 pages
for (int page = 0; page < pagecount; page++)
{
    var itens = list1.Skip(page * pagesize).Take(pagesize).ToList();
}