如何跳过已经迭代的行但读取未迭代的下一行?

How do I SKIP the already iterated rows but read the next rows that are not being iterated?

我正在尝试遍历一个集合,即但它应该只根据分页值进行迭代。

看,我有这个:

var SkipCount= 0;
var TakeCount= 50;

var list= db.tblCollection.where(r => r.Id > 1).orderby(r=> r.Id).Take(Take).Skip(SkipCount);

var totalTableRecords= list.count(); // 200 records in my case
var counter= 0;

现在外循环应 运行ning 直到达到 totalTableRecords-1 的总值。 对于外循环的每次迭代的内循环,它只检查指定数量的记录。

for( ;counter < totalTableRecords; )
{
     foreach(var l in list)
     {
          //Do some coding here
          
          counter= counter + 1;
          
     }
          SkipCount= TakeCount;
          TakeCount= TakeCount+ 50;
          
}
          

我想要实现的是,在外循环的第一个 运行 中,内循环应根据修剪后的记录执行一些操作,即 1st 50 记录。然后,在第二个运行中我们确实需要跳过第一个运行中已经执行的50条记录,而应该是下一个50条记录。然后在第三个循环中,它将忽略 1st2nd 运行 (50+50) 中已经读取的 100 记录和下一个 50 记录,直到计数器外循环符合条件。

我试过了,但它一直在 运行ning 直到极限,即 200,而实际完成的工作只是 4 次迭代。

我该如何解决这个问题?

我想您可能正在寻找类似于以下代码的内容。它将分 4 批迭代 200 多个项目。

public static IEnumerable<int> MyDataSource()
{
    Console.WriteLine("This will only be printed once");

    for (var i = 0; i < 200; i++)
    {
        yield return i;
    }
}

[Test]
public void SkipTest()
{
    var skipCount = 0;
    const int takeCount = 50;

    for (;;)
    {
        var currentList = MyDataSource().Skip(skipCount).Take(takeCount).ToArray();
        if (!currentList.Any())
        {
            return;                        
        }
        
        foreach (var currentVal in currentList)
        {
            Console.WriteLine(currentVal);
        }
        skipCount += takeCount;
    }
}

我感觉您发布的代码与您一直在测试的代码不太一样。在内部循环中更改 SkipCountTakeCount(对于您遍历的每个项目)似乎是错误的。

我会稍微重写一下,但总的来说:保持 TakeCount(页面大小)不变并增加 SkipCount(页码):

pageNum = 0; // Instead of SkipCount
pageSize = 50; // Instead of TakeCount
List<SomeType> page;

do
{
    page = db.tblCollection.Where(r => r.Id > 1)
        .OrderBy(r => r.Id)
        .Skip(pageNum * pageSize)
        .Take(pageSize)
        .ToList();

     foreach (var l in page)
     {
          //Do some coding here
     }

     pageNum++;
} while (page.Count > 0);