Member 13608602 Ответов: 3

Сравните две таблицы данных в C#


У меня есть две таблицы данных, и мне нужно сравнить два столбца и удалить некоторые результаты .

datatable 1

ID      COD     Nº     letter

83       65      0        abc

21       28      0        abc

12       32      3        asd

12       55      8        asd

datatable 2

ID      DETAIL

15       33

21       2

12       3


мне нужно сравнить идентификатор столбца datatable 1 и datatable 2 и получить в новом datatable результат:


datatable 3
ID      DETAIL     COD     Nº     letter

21         2         28      0        abc

12         3         32      3        asd

12         3         55     8        asd


Что я уже пробовал:

c#, linq и for, foreach и другие советы...

var filter = from firstDt in ds.AsEnumerable()where !(from secondDt in dsDC.AsEnumerable() select secondDt["ID"]).Contains(firstDt["ID"].ToString())
                    select firstDt; 
                    DataTable resultDt = filter.CopyToDataTable();

CHill60

В разделе "Что я пробовал" вы должны поделиться кодом, который вы пробовали. Вы должны показать нам, что вы используете, и рассказать нам, что пошло не так, чтобы мы могли вам помочь. Мы не собираемся писать ваш код для вас!

Member 13608602

Я попробовал это сделать, но ничего не вышло

фильтр ВАР = от firstDt в ДС.AsEnumerable()где !(из secondDt в dsDC.AsEnumerable() выберите secondDt["имя"]).Содержит(firstDt["имя"].Метод toString())
выберите firstDt;
DataTable resultDt = фильтр.CopyToDataTable();

Maciej Los

В каком аспекте таблицу 3 нового? Можете ли вы поделиться своей логикой? Пожалуйста, объясните, почему записи с идентификаторами 21, 12, 12 являются новыми... Почему ID 15 не рассматривается как новая запись?

Member 13608602

Id 15 не является threated, потому что он не находится в dtatable1(ID)

Maciej Los

Но ID 83 находится в datatable 1, но не в result datatable... (Используйте виджет ответа, если вы хотите уведомить меня о своем комментарии).

3 Ответов

Рейтинг:
18

Karthik_Mahalingam

пробовать

using System.Data;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt1 = new DataTable();
            dt1.Columns.Add("ID");
            dt1.Columns.Add("COD");
            dt1.Columns.Add("No");
            dt1.Columns.Add("letter");
            dt1.Rows.Add(83, 65, 0, "abc");
            dt1.Rows.Add(21, 28, 0, "abc");
            dt1.Rows.Add(12, 32, 3, "asd");
            dt1.Rows.Add(12, 55, 88, "asd");

            DataTable dt2 = new DataTable();
            dt2.Columns.Add("ID");
            dt2.Columns.Add("DETAIL");
            dt2.Rows.Add(15, 33);
            dt2.Rows.Add(21, 2);
            dt2.Rows.Add(12, 3);

            DataTable dtFinal = dt1.Clone();
            dtFinal.Columns.Add("DETAIL");
            foreach (DataRow row in dt1.Rows)
            {
                DataRow[] rowsTarget = dt2.Select(string.Format("ID={0}",row["ID"]));
                if (rowsTarget != null && rowsTarget.Length > 0)
                {
                    string detail = rowsTarget[0]["DETAIL"].ToString();
                   var lst =  row.ItemArray.ToList();
                    lst.Add(detail);
                    dtFinal.Rows.Add(lst.ToArray());
                }
            } 

        }
 
    }
}


Maciej Los

5ed, даже если OP не объясняет, почему некоторые записи должны быть или не должны быть в финальной таблице.

Karthik_Mahalingam

Спасибо, Мацей.
Давно не виделись.

Рейтинг:
0

Leo Chapiro

Выглядит как простой вложенный цикл, который вам нужен:

foreach() // loop over all rows of the table2 and get ID (ID_2)
{
    foreach() // loop over all rows of the table1 and get ID (ID_1)
    {
              if (ID_2 == ID_1)
                 // write this row in the table3
    }

}


Member 13608602

но мне нужно добавить столбец detail к datatable 3 и удалить строки de dont mismatch с datatable 1, я не знал, как это сделать.

Maciej Los

Отличная идея в псевдокоде. +5!

Leo Chapiro

Спасибо тебе, Мацей!

Рейтинг:
0

George Swan

Это модифицированная версия решения 2 с двумя примерами, первый использует Linq беглый синтаксис, а второй использует синтаксис запроса.


private static void Main(string[] args)
{
    var dt1 = new DataTable();
    dt1.Columns.Add("ID", typeof(long));
    dt1.Columns.Add("COD", typeof(int));
    dt1.Columns.Add("No", typeof(int));
    dt1.Columns.Add("letter", typeof(string));
    dt1.Rows.Add(83, 65, 0, "abc");
    dt1.Rows.Add(21, 28, 0, "abc");
    dt1.Rows.Add(12, 32, 3, "asd");
    dt1.Rows.Add(12, 55, 88, "asd");

    var dt2 = new DataTable();
    dt2.Columns.Add("ID", typeof(long));
    dt2.Columns.Add("DETAIL", typeof(string));
    dt2.Rows.Add(15, 33);
    dt2.Rows.Add(21, 2);
    dt2.Rows.Add(12, 3);

    DataTable dtTemp = dt1.Clone();
    dtTemp.Columns.Add("DETAIL");

    DataTable resultDataTable =
        dt1.AsEnumerable()
            .Join(
                dt2.AsEnumerable(),
                f => f.Field<long>("ID"),
                s => s.Field<long>("ID"),
                (f, s) => new { f, s })
            .Select(
                a =>
                    dtTemp.LoadDataRow(
                        new object[]
                        {
                            a.f.Field<long>("ID"),
                            a.f.Field<int>("COD"),
                            a.f.Field<int>("No"),
                            a.f.Field<string>("letter"),
                            a.s.Field<string>("DETAIL")
                        },
                        false))
            .CopyToDataTable();
    //using query syntax
    DataTable resultDataTable2 = (from dataRows1 in dt1.AsEnumerable()
    join dataRows2 in dt2.AsEnumerable()
      on dataRows1.Field<long>("ID") equals dataRows2.Field<long>("ID")
        select
            dtTemp.LoadDataRow(
                new object[]
                {
                    dataRows1.Field<long>("ID"),
                    dataRows1.Field<int>("COD"),
                    dataRows1.Field<int>("No"),
                    dataRows1.Field<string>("letter"),
                    dataRows2.Field<string>("DETAIL")
                },
                false)).CopyToDataTable();
}


Maciej Los

Очень хорошее решение Linq! 5ed!

Одно замечание: некоторые поля являются typeof(int) вместо string ;)
Я очень ценю метод LoadDataRow.

George Swan

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