如何跳过已经迭代的行但读取未迭代的下一行?
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
条记录。然后在第三个循环中,它将忽略 1st
和 2nd
运行 (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;
}
}
我感觉您发布的代码与您一直在测试的代码不太一样。在内部循环中更改 SkipCount
和 TakeCount
(对于您遍历的每个项目)似乎是错误的。
我会稍微重写一下,但总的来说:保持 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);
我正在尝试遍历一个集合,即但它应该只根据分页值进行迭代。
看,我有这个:
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
条记录。然后在第三个循环中,它将忽略 1st
和 2nd
运行 (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;
}
}
我感觉您发布的代码与您一直在测试的代码不太一样。在内部循环中更改 SkipCount
和 TakeCount
(对于您遍历的每个项目)似乎是错误的。
我会稍微重写一下,但总的来说:保持 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);