[英]Split Data Table by Column Count
如何拆分具有動態列數和名稱的DataTable
理想情況下,我想要一個方法簽名,例如
List<DataTable> SplitColumnOnColumn(DataTable table, int count)
| columnFirst | columnSecond | 第三欄 columnFourth | columnFifth |
| row1val1 | row1val2 | row1val3 | row1val4 | row1val5 |
| row2val1 | row2val2 | row2val3 | row2val4 | row2val5 |
| row3val1 | row3val2 | row3val3 | row3val4 | row3val5 |
鑒於上表
SplitColumnOnColumn(myTable, 3)
哪個會產生
| columnFirst | columnSecond | 第三欄
| row1val1 | row1val2 | row1val3 |
| row2val1 | row2val2 | row2val3 |
| row3val1 | row3val2 | row3val3 |
| columnFourth | columnFifth |
| row1val4 | row1val5 |
| row2val4 | row2val5 |
| row3val4 | row3val5 |
由於DataTable
不能立即提供此功能,因此您必須自己創建它。
我的建議是克隆DataTable
,然后從每個不需要的表中刪除列。
將下面的示例修改為可用的功能,留給讀者參考。
static void Main(string[] args)
{
int[] sourceData = {0,0,0,0,0};
DataTable source = new DataTable();
source.Columns.Add("ColOne");
source.Columns.Add("ColTwo");
source.Columns.Add("ColThree");
source.Columns.Add("ColFour");
source.Columns.Add("ColFive");
for (var rowIndex = 0; rowIndex < 5; rowIndex++)
{
for (var colIndex = 0; colIndex < source.Columns.Count; colIndex++)
{
sourceData[colIndex] = rowIndex * colIndex;
}
source.Rows.Add(sourceData);
}
DataTable target = new DataTable();
target = source.Clone();
Console.WriteLine("Before split");
Console.Write("Source -> ");
foreach (DataColumn col in source.Columns) {
Console.Write(col.ColumnName + ", ");
}
Console.WriteLine();
Console.Write("Target -> ");
foreach (DataColumn col in target.Columns)
{
Console.Write(col.ColumnName + ", ");
}
Console.WriteLine();
target.Columns.RemoveAt(0);
target.Columns.RemoveAt(0);
target.Columns.RemoveAt(0);
source.Columns.RemoveAt(3);
source.Columns.RemoveAt(3);
Console.WriteLine();
Console.WriteLine("After split");
Console.Write("Source -> ");
foreach (DataColumn col in source.Columns)
{
Console.Write(col.ColumnName + ", ");
}
Console.WriteLine();
Console.Write("Target -> ");
foreach (DataColumn col in target.Columns)
{
Console.Write(col.ColumnName + ", ");
}
Console.WriteLine();
if (Debugger.IsAttached) {
Console.WriteLine();
Console.WriteLine("ANY KEY TO EXIT");
Console.ReadKey(true);
}
}
在Dan-o建議如何解決這個問題之后,我想到了這個。
public List<DataTable> SplitOnColumnCount(DataTable inputTable, int columnCount)
{
if (inputTable == null || columnCount < 1)
{
return null;
}
var tableList = new List<DataTable>();
var grouping = Convert.ToInt32(Math.Ceiling((inputTable.Columns.Count) / ((double)columnCount)));
var columnNames = inputTable.Columns.Cast<DataColumn>().Select(_ => _.ColumnName).ToArray();
for (var i = 1; i <= grouping; i++)
{
var columnsThisTime = columnNames.Skip((i - 1) * columnCount).Take(columnCount).ToArray();
var newTable = inputTable.Copy();
var removingColumns = columnNames.Where(_ => columnsThisTime.All(keep => keep != _));
foreach (var columnName in removingColumns)
{
newTable.Columns.Remove(columnName);
}
newTable.AcceptChanges();
tableList.Add(newTable);
}
return tableList;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.