Как бы я отфильтровать этот набор данных? - PullRequest
0 голосов
/ 27 февраля 2019

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

В этом наборе данных есть таблицы с именами таблица 1 и таблица 2, и когда ониОтобранные они похожи на картинку ниже.Он показывает столбцы, и мне нужно сравнить эти столбцы со строками из соответствующей таблицы в первом наборе данных

Я смотрел на dataview, но это было бы много работы, и я оченьнеопытный.Я пытаюсь найти способ реализовать цикл foreach, который будет получать имя таблицы в первом наборе данных, а затем сравнивать строки в нем со столбцами внутри набора данных во втором наборе данных, которые соответствуют имени таблицы изпервый набор данных.

1 Ответ

0 голосов
/ 27 февраля 2019

Не зная больше об этих DataSets (например, имеют ли они первичные ключи, типы данных столбцов, количество строк в каждой таблице и т. Д.), Я могу предоставить только ограниченную помощь.Следующий пример пытается быть как можно более общим и избегать некоторых основных проблем:

DataSet ds1 = <<fetch dataset1>>;
DataSet ds2 = <<fetch dataset2>>;
foreach (DataTable tbl1 in ds1.Tables)
{
    if (ds2.Tables.Contains(tbl1.TableName))
    {
        DataTable tbl2 = ds2.Tables[tbl1.TableName];
        List<string> commonColumnNames = new List<string>(tbl1.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Intersect(tbl2.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
        int maxRows = Math.Min(tbl1.Rows.Count, tbl2.Rows.Count);
        for (int r = 0; r <= maxRows; r++)
        {
            foreach (string colName in commonColumnNames)
            {
               if (tbl1.Rows[r][colName] != tbl2.Rows[r][colName])
               {
                    // Different value
               }
            }
        }
    }
}

Обновление 1: Я добавил комментарии к следующему примеру, чтобы объяснить шаг-шаг за шагом, что делает этот код.Как я уже говорил ранее, поскольку я мало что знал о ваших данных, мне пришлось добавить дополнительный код.Этот дополнительный код предназначен для таких вещей, как: «Существует ли таблица ABC в обоих наборах данных?», «Есть ли в двух таблицах одинаковые столбцы?», «В таблицах одинаковое количество строк?»,В вашем исходном вопросе не было этой информации, поэтому я сделал этот код немного более надежным для обработки этих неизвестных.

DataSet ds1 = <<fetch dataset1>>;
DataSet ds2 = <<fetch dataset2>>;

// Loop through all of the tables in the 1st DataSet
foreach (DataTable tbl1 in ds1.Tables)
{
    // If the 2nd DataSet has a table with same name as the one from the 1st DataSet
    if (ds2.Tables.Contains(tbl1.TableName))
    {
        DataTable tbl2 = ds2.Tables[tbl1.TableName];
        // Create a list of column names that the two tables have in common.
        // We will only compare the values in these two tables, in this set of matching column names.

        List<string> commonColumnNames = new List<string>(tbl1.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Intersect(tbl2.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
        // Before we start comparing the rows in the two tables, find out which one has the fewer number of rows in it.
        int maxRows = Math.Min(tbl1.Rows.Count, tbl2.Rows.Count);
        // If the tables have a different number of rows, then we will only compare the set of rows numbered 0-to-MinRowCount
        for (int r = 0; r <= maxRows; r++)
        {
            // For each row, compare the values of common columns
            foreach (string colName in commonColumnNames)
            {
               if (tbl1.Rows[r][colName] != tbl2.Rows[r][colName])
               {
                    // Different value
               }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...