Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从列表中删除多个元素_C#_List_Collections_Batch Processing_Generic Collections - Fatal编程技术网

C# 从列表中删除多个元素

C# 从列表中删除多个元素,c#,list,collections,batch-processing,generic-collections,C#,List,Collections,Batch Processing,Generic Collections,我想知道,在我的例子中,有没有一种优雅的方法可以从一个泛型集合(一个列表)中删除多个项,而不必执行诸如在LINQ查询中指定谓词来查找要删除的项之类的操作 我正在做一些批处理,在其中我用需要处理的记录对象类型填充一个列表。此处理以将每个对象插入数据库结束。我不想构建列表,然后循环遍历每个成员并处理/插入它,而是希望对列表中的N个项目组执行事务性批量插入,因为它的资源密集度较低,其中N表示可以放入配置文件或等效文件中的批大小 我希望做一些类似的事情: 公众档案 { //记录列表将是列表的集合 var

我想知道,在我的例子中,有没有一种优雅的方法可以从一个泛型集合(一个列表)中删除多个项,而不必执行诸如在LINQ查询中指定谓词来查找要删除的项之类的操作

我正在做一些批处理,在其中我用需要处理的记录对象类型填充一个列表。此处理以将每个对象插入数据库结束。我不想构建列表,然后循环遍历每个成员并处理/插入它,而是希望对列表中的N个项目组执行事务性批量插入,因为它的资源密集度较低,其中N表示可以放入配置文件或等效文件中的批大小

我希望做一些类似的事情:

公众档案 { //记录列表将是列表的集合 var listOfRecords=GetListOfRecordsFromDb\u connectionString; var batchSize=Convert.ToInt32 ConfigurationManager.AppSettings[batchSize]; 做 { var recordSubset=listOfRecords.TakebatchSize; 在插入记录子集之前发生的DoProcessingsTuff; InsertBatchOfRecords记录子集; //现在我想从原始列表中删除添加到recordSubset的对象 //之后listOfRecords的大小应为listOfRecords.Count-batchSize }而记录列表。有吗 } 我正在寻找一种一次完成这一切的方法,而不是遍历子集并以这种方式删除项,例如:

foreach(Record rec in recordSubset)
{
   if( listOfRecords.Contains(rec) ) 
   { 
      listOfRecords.Remove(rec);
   }
}
我正在考虑使用List.RemoveRange batchSize,但首先想得到一些StackOverflow反馈:您使用什么方法来最大限度地提高C语言中批处理算法的效率

非常感谢您的任何帮助/建议/提示

有一个可以让你打电话的

var listOfRecords = GetListOfRecordsFromDb( _connectionString );
var batchSize = Convert.ToInt32( ConfigurationManager.AppSettings["BatchSize"] );

foreach(var batch in listOfRecords.Batch(batchSize))
{
   DoProcessingStuffThatHappensBeforeInsert(batch);
   InsertBatchOfRecords(batch);
}
您无需费心从记录列表中删除内容。

有一个允许您拨打电话的

var listOfRecords = GetListOfRecordsFromDb( _connectionString );
var batchSize = Convert.ToInt32( ConfigurationManager.AppSettings["BatchSize"] );

foreach(var batch in listOfRecords.Batch(batchSize))
{
   DoProcessingStuffThatHappensBeforeInsert(batch);
   InsertBatchOfRecords(batch);
}
您无需费心从记录列表中删除内容。

使用扩展方法

public static IEnumerable<List<T>> ToBatches<T>(this List<T> list, int batchSize)
{
    int index = 0;
    List<T> batch = new List<T>(batchSize);

    foreach (T item in list)
    {
        batch.Add(item);    
        index++;

        if (index == batchSize)
        {
            index = 0;                
            yield return batch;
            batch = new List<T>(batchSize);
        }
    }

    yield return batch;
}
用可拓方法

public static IEnumerable<List<T>> ToBatches<T>(this List<T> list, int batchSize)
{
    int index = 0;
    List<T> batch = new List<T>(batchSize);

    foreach (T item in list)
    {
        batch.Add(item);    
        index++;

        if (index == batchSize)
        {
            index = 0;                
            yield return batch;
            batch = new List<T>(batchSize);
        }
    }

    yield return batch;
}

什么是课堂记录?它是自定义类还是IDataRecord?看起来您要获取的记录都在列表的开头。为什么不使用队列呢?Record是一个假设的自定义类,我用它来说明这个概念。什么是类Record?它是自定义类还是IDataRecord?看起来您要获取的记录都在列表的开头。为什么不使用队列呢?Record是一个假设的自定义类,我用来说明这个概念。我认为最好先创建批量大小的列表。@HamletHakobyan完全同意我认为最好先创建批量大小的列表。@HamletHakobyan完全同意