如何在面向列的c#数据表中将行范围从一列复制到其他列
本文关键字:范围 复制 一列 其他 数据表 | 更新日期: 2023-09-27 18:03:50
根据我的理解,数据表的条目通常是面向行的,其中列具有一定的含义,行表示不同的数据集。这也是使用DataTable.Rows.Add()添加实际数据的原因。在我的例子中,这些列被认为是一个数据集,我需要从这些列中提取数据以供其他领域使用。
我使用LINQ和Lambda表达式的组合来获得一个完整列的数据:
int curCol = 4;
int maxRows = 55;
byte[] values = new byte[maxRows];
values = dt.Rows.Cast<DataRow>().Select<DataRow, byte>(row => Convert.ToByte(row[curCol])).ToArray();
但这是我的运气与LINQ和Lambda结束。我尝试实现一个复制例程来选择与源不同的列,但在某一行中具有相同的值。然后选择要复制到所有其他匹配列的行范围。下面是for和if语句的示例:
const int numCols = 10;
int curCol = 2;
int searchRow = 1;
int startRow = 3;
int numRows = 25;
byte val = (byte)dt.Rows[searchRow][curCol];
// iterate through all columns
for (int col = 0; col < numCols; col++)
{
// look for "other" columns with the same value in the searchRow of interest
if (col != curCol && val == (byte)dt.Rows[searchRow][col])
{
// iterate through the given row range (startRow and numRows)
for (int row = startRow; row < startRow+numRows; row++)
{
// copy from current column
dt.Rows[row][col] = dt.Rows[row][curCol];
}
}
}
我想知道是否有一个更好的,更有效的方法来实现这个使用LINQ和Lambda表达式?
示例数据
1 2 3 4 ... // cols 0 .. 3 in row 0
5 5 6 6 ... // cols 0 .. 3 in row 1
0 0 1 0 ... // ...
7 0 8 0 ...
9 0 9 0 ...
. . . .
预期的结果
1 2 3 4 ...
5 5 6 6 ... // value in col 3 is equal to value in col 2
0 0 1 0 ...
7 0 8 8 ... // value from col 2 copied to col 3
9 0 9 9 ... // value from col 2 copied to col 3
. . . .
我希望这能让你更容易理解。第2列和第3列按第1行中的值分组/链接,由于第2列是源,因此应将选定行范围中的其他值复制到链接的列。为了说清楚一点。上面的If/For实现正是这样做的。我只是希望LINQ/Lambda快捷方式或另一种更有效的执行方式。
我看得不多:
DataTable dt = new DataTable();
const int numCols = 10;
int curCol = 4;
int searchRow = 1;
int startRow = 3;
int numRows = 25;
int hashVal = dt.Rows[searchRow][curCol].GetHashCode();
var thisValue = dt.Rows[searchRow][curCol];
//iterate cols and rows
for(int c = 0; c < numCols; c++)
{
for(int r = startRow; r < startRow + numRows; r++)
{
int thisHash = dt.Rows[r][c].GetHashCode();
if (thisHash == hashVal)
{
dt.Rows[r][c] = thisValue;
}
}
}
什么惊天动地的突破。不过,我不明白的是,您似乎正在寻找匹配的值,以便复制匹配的值-默认情况下,如果值已经等于源行/col,那么为什么需要复制它(因为它已经相等)?也许您是为了演示目的而简化,但我认为没有必要这样做…