сравнить датары разных таблиц - PullRequest
3 голосов
/ 30 января 2012

Некоторое время назад я опубликовал аналогичный запрос и решил урезать его сложность, чтобы дать разработчикам возможность ответить на мою главную проблему.Это может быть указано как дубликат, но все же я хочу опубликовать его, так как редактирование предыдущего сообщения не дало особого результата.

У меня есть 2 таблицы данных: dataTable1 и dataTable2.Оба имеют 1 строку с одинаковыми записями.Например,столбцами в обеих таблицах данных являются Имя, Класс, Тема.Теперь обе строки обоих dataTable совпадают со значениями («Джон», «5», «Наука»).Теперь я хочу сравнить эти 2 строки, если они имеют одинаковые записи или нет.Я пытался:

if(dataTable1.Rows[0].GetHashCode() == dataTable2.Rows[0].GetHashCode()) 
{ 
    // Result is false (but I expected it to be true) 
} 

И также пытался:

if(dataTable1.Rows[0].ItemArray == dataTable2.Rows[0].ItemArray) 
{ 
    // Result is false (but I expected it to be true) 
} 

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

Ответы [ 5 ]

3 голосов
/ 30 января 2012

Вы можете использовать Equals метод класса DataRowComparer для сравнения строк.

2 голосов
/ 30 января 2012
var result= dataTable1.AsEnumerable().Intersect(dataTable2.AsEnumerable(),
                                                    DataRowComparer.Default);

возвращает записи, которые находятся в обеих таблицах

подробнее на:

http://msdn.microsoft.com/en-us/library/bb386998.aspx

1 голос
/ 24 декабря 2018

Использование SequenceEqual для сравнения двух строк данных, как в следующем примере

foreach (DataRow dr in datatable1.Rows)
    foreach (DataRow dr2 in datatable2.Rows)
    {
        if (dr.ItemArray.SequenceEqual(dr2.ItemArray))
        {
            MessageBox.Show("dr = dr2");
            //statement                                    
        }
        else
        {
            MessageBox.Show("dr != dr2");
            //statement
        }
    }
0 голосов
/ 30 января 2012

Другой вариант:

DataView dv = new DataView(dataTable1); 
dv.Filter = "SQL query to find specific row"

Это, естественно, для каждого сырья, которое вы найдете

0 голосов
/ 30 января 2012

Для простоты я бы обычно приводил элемент в ItemArray к строке и сравнивал их таким образом.
Из того, что я помню, использование GetHashCode не даст тот же результат, что и многие другие скажут.
Если у вас большое количество строк, вы можете попробовать создать класс, который наследуется от DataRow, и переопределить метод Equals. Например:
class CustomRow : DataRow {</p> <pre><code> public override bool Equals(object obj) { if(obj.GetType() != typeof(CustomRow)) return false; for (int i = 0; i < ItemArray.Length; i++) if (((CustomRow)obj)[i] != this[i]) return false; return true; } }

...