Есть ли способ получить последние ненулевые значения каждого столбца в C# DataTable и отобразить их как одну строку? - PullRequest
0 голосов
/ 03 августа 2020

Я хочу взять последние ненулевые значения каждого столбца в DataTable и создать с ними одну строку.

Пример кода:

DataTable temp; // temp is the DataTable shown on the left side in the "Current Result" section
DataTable temp2; // stores the newly create DataTable row

foreach(DataRow row in temp.Rows){
    object[] Item = new object[] {};
    foreach(DataColumn col in temp.Columns){
        if (row[col] != null || row[col] != DBNull.Value || !String.IsNullOrWhiteSpace(row[col].ToString()))
        {
            Array.Resize(ref Item, Item.Length + 1);
            Item[Item.Length - 1] = row[col];
        }
    }
    temp2.Rows.Add(Item);
}

Мой код в настоящее время копирует все ячейки из одной таблицы данных в другую, включая ячейки, в которых нет сохраненных значений.

Текущий результат: enter image description here


In the photo below, I blacked out all the cells except of the last non-values of each column. I want the shown values to be stored and displayed as a single row.

Desired Result: введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Не знаю, решена ли проблема. Это мое предложение по решению проблемы. Я бы сделал go от последней строки до первой, потому что задача состоит в том, чтобы получить последнее значение из каждого столбца, а затем l oop может быть ошибочным окончанием sh, как если бы вы go из сверху вниз таблицы. Но это, я думаю, также зависит от данных в таблице.

DataTable temp = yourTable; // the original table
DataTable temp2 = new DataTable();

object[] lastNonNullValues = new object[temp.Columns.Count];
// Index of the last row.
int lastRow = temp.Rows.Count - 1;

// Get from the last row to the first
for (int i = lastRow; i >= 0; i--)
{
    // Don't know if necessary but if all columns has an value -> finish.
    if (lastNonNullValues.All(x => x != null)) break;

    DataRow row = temp.Rows[i];
    for (int j = 0; j < temp.Columns.Count; j++)
    {
        // Continue if some value was written
        if (lastNonNullValues[j] != null) continue;
        // None of this condition should be true, thas why should change from || to &&
        if (row[j] != null && row[j] != DBNull.Value && !string.IsNullOrWhiteSpace(row[j].ToString()))
        {
            lastNonNullValues[j] = row[j];
        }
    }
}

temp2.Rows.Add(lastNonNullValues);

Примечание:

Решение Rufus L также должно работать при изменении оператора if от или до и-соединение .

0 голосов
/ 03 августа 2020

Мне кажется, что вы просто хотите добавить одну строку в таблицу temp2, которая имеет последнее ненулевое значение для каждого столбца. В этом случае вы можете инициализировать object[] размером Columns.Count, и мы можем l oop через столбцы, используя индекс столбца, что позволяет нам присвоить новое значение существующему столбцу, когда мы найдем ненулевое значение для него в текущей строке:

DataTable temp = new DataTable();
DataTable temp2 = temp.Clone();

// A single row of data that is 'Columns.Count' long
object[] lastNonNullValues = new object[temp.Columns.Count];

foreach (DataRow row in temp.Rows)
{
    // Loop through columns using the column index rather than a foreach
    for (int i = 0; i < temp.Columns.Count; i++)
    {
        var col = temp.Columns[i];

        if (row[col] != null || row[col] != DBNull.Value ||
            !string.IsNullOrWhiteSpace(row[col].ToString()))
        {
            // Now we just assign the value at the index for this column
            lastNonNullValues[i] = row[col];
        }
    }
}

// Add our single row to the results table
temp2.Rows.Add(lastNonNullValues);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...