从列表中获取一组项目并根据需要执行某些操作

时间:2016-03-09 09:24:05

标签: c# linq

我有一个列表中的项目列表。从该列表中我需要获取前1000个项目并需要提交包,然后我需要再拿1000个并需要提交包。如果列表没有1000,我需要提交包含所有项目的包。为此,我编写了以下代码,该代码在修改集合时返回错误。

List<SyncQueue> tempMassiveSyncQueue=massiveSyncQueue;
while (tempMassiveSyncQueue.Count != 0)
{
    int MassivePackageFileCount =Convert.ToInt32(ConfigurationManager.AppSettings["MassivePackageFileLimit"]);
     massiveSyncQueues = tempMassiveSyncQueue;
    List<SyncQueue> tempMassivePackageSyncQueue=new List<SyncQueue>();
     if (massiveSyncQueues.Count > 1000
     {
         var massivePackageSyncQueue = (massiveSyncQueues.Take(1000)).ToList<SyncQueue>();
         tempMassivePackageSyncQueue = massivePackageSyncQueue;

         SubmitPackage(massivePackageSyncQueue);
     }

     if (tempMassivePackageSyncQueue.Count != 0)
     {
         foreach (var massivesynq in tempMassiveSyncQueue)
         {
             foreach (var deleteId in tempMassivePackageSyncQueue.Where(id => id.SyncQueueId == massivesynq.SyncQueueId))
             {
                 tempMassiveSyncQueue.Remove(massivesynq);
             }
         }
     }


     else
     {
         SubmitPackage(massiveSyncQueues);

     }
    massiveSyncQueues = null;
}

任何人都可以帮忙吗?

4 个答案:

答案 0 :(得分:0)

您的问题是您正在调整设置foreach结构边界的集合。

尝试在循环的集合上使用ToList(),因为这会在内存中创建一个新的List:

    foreach (var massivesynq in tempMassiveSyncQueue.ToList())
{
    foreach (var deleteId in tempMassivePackageSyncQueue.Where(id => id.SyncQueueId == massivesynq.SyncQueueId).ToList())
    {
        tempMassiveSyncQueue.Remove(massivesynq);
    }
}

答案 1 :(得分:0)

在第1行中设置tempMassiveSyncQueue = massiveSyncQueue,但在while循环中设置了massiveSyncQueue = tempMassiveSync。

当您修改正在循环的集合时,通常会发生集合修改错误。这就是为什么你需要首先创建一个与原始集合无关的集合的副本并循环遍历它。

在while循环之前,您需要将massiveSyncQueue中的所有项目添加到tempMassiveSyncQueue。然后,您需要使用代码遍历临时列表。在第二个循环中,您将从正在循环的列表中删除项目。我假设您打算从massiveSyncQueue而不是临时列表中删除项目。

尝试以下方法:

List<SyncQueue> tempMassiveSyncQueue = new List<SyncQueue>();
foreach(var item in massiveSyncQueue)
{
   tempMassiveSyncQueue.Add(item);
}
while (tempMassiveSyncQueue.Count != 0)
{
int MassivePackageFileCount = Convert.ToInt32(ConfigurationManager.AppSettings["MassivePackageFileLimit"]);
List<SyncQueue> tempMassivePackageSyncQueue=new List<SyncQueue>();
 if (massiveSyncQueues.Count > 1000
 {
     var massivePackageSyncQueue = (massiveSyncQueues.Take(1000)).ToList<SyncQueue>();
     tempMassivePackageSyncQueue = massivePackageSyncQueue;

     SubmitPackage(massivePackageSyncQueue);
 }

 if (tempMassivePackageSyncQueue.Count != 0)
 {
     foreach (var massivesynq in massiveSyncQueue)
     {
         foreach (var deleteId in tempMassivePackageSyncQueue.Where(id => id.SyncQueueId == massivesynq.SyncQueueId))
         {
             massiveSyncQueue.Remove(massivesynq);
         }
     }
 }


 else
 {
     SubmitPackage(massiveSyncQueues);

 }
massiveSyncQueues = null;

}

答案 2 :(得分:0)

将Skip合并到您的逻辑中

int loopCount = 0;
While(true)
{
    var ListToProcess = massiveSyncQueue.Skip(loopCount*1000).Take(1000);

    SubmitPackage(ListToProcess);

    if(ListToProcess.Count < 1000)   // We know there are no more in the list massive list.
    {
        break;
    }
    loopCnt++;
}

答案 3 :(得分:0)

试试这个

int count=1;
while(tempMassivePackageSyncQueue.Count>1000)
{


    var massivePackageSyncQueue = (massiveSyncQueues.skip(count*1000).Take(1000)).ToList<SyncQueue>();
         tempMassivePackageSyncQueue = massivePackageSyncQueue;

         SubmitPackage(massivePackageSyncQueue);
    count++;

}
var massivePackageSyncQueue = (massiveSyncQueues.skip(count*1000).Take()).ToList<SyncQueue>();
         tempMassivePackageSyncQueue = massivePackageSyncQueue;

         SubmitPackage(massivePackageSyncQueue);