如何在面向列的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快捷方式或另一种更有效的执行方式。

如何在面向列的c#数据表中将行范围从一列复制到其他列

我看得不多:

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,那么为什么需要复制它(因为它已经相等)?也许您是为了演示目的而简化,但我认为没有必要这样做…