C# 如何将List拆分成多个子集合

本文介绍了一种高效的方法来将大型数据集分为多个子集合,并提供了在实际应用中的案例,包括数据分组、处理及批量插入数据库的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上的例子:
问:List<string> list = new List<string>();
        for (int i = 1; i < 95; i++)
        {
            list.Add(i.ToString());
        }
如何将list拆分成10个子集合?


答案:

 List<List<string>> listGroup = new List<List<string>>();
            int j = 10;
            for (int i = 0; i < list1.Count; i += 10)
            {
                List<string> cList = new List<string>();
                cList = list1.Take(j).Skip(i).ToList();
                j +=10;
                listGroup.Add(cList);
            }


个人使用中的实例如下:
                    #region  新方法

                List<List<hourhistoryrecorditem>> listGroup = new List<List<hourhistoryrecorditem>>();
                int j = 500000;
                for (int i = 0; i < lstVals.Count; i += 500000) //以50万为一组分组
                {
                    List<hourhistoryrecorditem> cList = new List<hourhistoryrecorditem>();
                    cList = lstVals.Take(j).Skip(i).ToList();
                    j += 500000;
                    listGroup.Add(cList);
                }
                for (int i = 0; i < listGroup.Count; i++)
                {
                    List<hourhistoryrecorditem> list = new List<hourhistoryrecorditem>();
                    list = listGroup[i];
                    foreach (hourhistoryrecorditem aItem in list)
                    {
                        int iOffset = 0;
                        DataRow r = dt.NewRow();

                        r[iOffset++] = DBNull.Value;
                        r[iOffset++] = aItem.CurValue;
                        r[iOffset++] = aItem.MaxValue_;
                        r[iOffset++] = aItem.MinValue;
                        r[iOffset++] = aItem.AvgValue;
                        r[iOffset++] = aItem.ValueFlag;
                        r[iOffset++] = aItem.RecordType;
                        r[iOffset++] = aItem.NodeID;
                        r[iOffset++] = aItem.LogDT;
                        r[iOffset++] = aItem.DataCount;
                        r[iOffset++] = aItem.Increment;
                        r[iOffset++] = aItem.VTopVal;
                        r[iOffset++] = aItem.TopVal;
                        r[iOffset++] = aItem.NormalVal;
                        r[iOffset++] = aItem.LowVal;
                        r[iOffset++] = aItem.VLowVal;
                        r[iOffset++] = aItem.ChargeVal;
                        r[iOffset++] = aItem.IncVTopVal;
                        r[iOffset++] = aItem.IncTopVal;
                        r[iOffset++] = aItem.IncNormalVal;
                        r[iOffset++] = aItem.IncLowVal;
                        r[iOffset++] = aItem.IncVLowVal;
                        r[iOffset++] = aItem.IncChargeVal;
                        r[iOffset++] = aItem.OrgID;

                        dt.Rows.Add(r);

                    }
                    TablesBlukInsertOp.BulkToDB(dt, "hourhistoryrecorditem");
                    dt.Rows.Clear(); //执行完插入后,记得清空DataTable
                }

                #endregion





<think>好的,我现在需要帮助用户解决如何使用C#将Excel工作表拆分个独立的Excel文件的问题。用户已经提供了一些引用内容,我需要仔细分析这些引用并找到合适的解决方案。 首先,查看用户提供的引用,特别是引用[2]和引用[3]。引用[2]提到使用C#和FreeSpire.XLS库来根据行范围或部门名称拆分Excel文件。引用[3]展示了Python中使用pandas库的示例,但用户希望用C#实现。引用[5]涉及操作工作表,比如添加和删除,这可能对拆分过程有帮助。 用户的需求很明确:拆分Excel的某个工作表到个文件,每个文件包含特定条件的数据,比如按某列的唯一值分割。需要生示例代码,并确保使用正确的库和方法。 首先,确定使用哪个C#库处理Excel。常见的库有EPPlus、ClosedXML、NPOI,以及引用中提到的FreeSpire.XLS。引用[2]使用了FreeSpire.XLS,可能这是一个可行的选择。但考虑到免费版本可能有功能限制,需要确认是否有更好的选择。例如,EPPlus现在在非商业用途下是免费的,且功能强大。 接下来,拆分逻辑。用户可能希望根据某一列的唯一值来拆分数据,类似于Python中的pandas方法。在C#中,需要读取原始工作表,遍历每一行,根据指定列的值将行分配到不同的DataTable或集合中,然后将每个集合保存为单独的Excel文件。 步骤分解: 1. 加载原始Excel文件和工作表。 2. 确定拆分依据的列。 3. 收集该列的所有唯一值。 4. 遍历工作表的每一行,根据唯一值将行分组。 5. 为每个分组创建新的工作簿,并保存数据。 6. 处理Excel对象的释放,避免内存泄漏,如引用[1]提到的释放COM对象。 在代码实现中,需要注意使用正确的库方法。例如,使用EPPlus时,每个新文件需要创建一个ExcelPackage实例,添加工作表,并将数据写入。同时,处理可能的异常,并确保资源被正确释放。 另外,引用[1]提到在C#中操作Excel后需要释放COM对象,这在处理Excel Interop时非常重要,但EPPlus不需要COM,因此可能更安全高效。因此,建议使用EPPlus库来实现。 现在,编写示例代码的大纲: - 使用EPPlus读取原始文件。 - 确定拆分列,获取唯一值。 - 为每个唯一值创建新的Excel文件,复制对应的行数据。 - 保存并关闭所有文件。 需要确保代码结构清晰,处理可能的错误,如列不存在或文件无法访问等。同时,添加注释说明每一步的操作,方便用户理解。 最后,根据用户要求生相关问题,例如优化方法、处理大数据量的建议等,帮助用户进一步扩展应用场景。</think>以下是在C#中实现将Excel工作表拆分个独立文件的详细解决方案(基于EPPlus库实现): ```csharp using OfficeOpenXml; using System.Collections.Generic; using System.IO; public class ExcelSplitter { public void SplitWorksheetByColumn(string sourcePath, string sheetName, string splitColumn) { // 设置EPPlus的LicenseContext(社区版使用非商业许可) ExcelPackage.LicenseContext = LicenseContext.NonCommercial; FileInfo sourceFile = new FileInfo(sourcePath); using (var package = new ExcelPackage(sourceFile)) { // 获取源工作表 var sourceSheet = package.Workbook.Worksheets[sheetName]; if (sourceSheet == null) return; // 获取拆分列的索引 int colIndex = GetColumnIndex(sourceSheet, splitColumn); if (colIndex < 1) return; // 收集唯一值及其对应行数据 var valueGroups = new Dictionary<object, List<ExcelRangeBase>>(); int totalRows = sourceSheet.Dimension.Rows; for (int row = 2; row <= totalRows; row++) // 假设第一行是标题 { var cellValue = sourceSheet.Cells[row, colIndex].Value; var rowData = sourceSheet.Cells[row, 1, row, sourceSheet.Dimension.Columns]; if (!valueGroups.ContainsKey(cellValue)) { valueGroups[cellValue] = new List<ExcelRangeBase>(); } valueGroups[cellValue].Add(rowData); } // 为每个唯一值创建新文件 foreach (var group in valueGroups) { CreateNewFile(sourceFile, sourceSheet, group.Key?.ToString(), group.Value); } } } private int GetColumnIndex(ExcelWorksheet sheet, string columnName) { for (int col = 1; col <= sheet.Dimension.Columns; col++) { if (sheet.Cells[1, col].Text == columnName) return col; } return -1; } private void CreateNewFile(FileInfo sourceFile, ExcelWorksheet sourceSheet, string groupName, List<ExcelRangeBase> rows) { string newFileName = $"{Path.GetFileNameWithoutExtension(sourceFile.Name)}_{groupName}.xlsx"; FileInfo newFile = new FileInfo(Path.Combine(sourceFile.DirectoryName, newFileName)); using (var newPackage = new ExcelPackage(newFile)) { var newSheet = newPackage.Workbook.Worksheets.Add(sourceSheet.Name); // 复制标题行 sourceSheet.Cells[1, 1, 1, sourceSheet.Dimension.Columns].Copy(newSheet.Cells[1, 1]); // 写入数据行 int currentRow = 2; foreach (var row in rows) { row.Copy(newSheet.Cells[currentRow, 1]); currentRow++; } newPackage.Save(); } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值