Я использую DataRelation
для сравнения двух DataTable
и возврата третьей таблицы, содержащей строки, которые не являются общими для обеих исходных таблиц, с помощью этого учебника .Ниже приведен код.
public static DataTable Difference(DataTable First, DataTable Second)
{
//Create Empty Table
DataTable table = new DataTable("Difference");
//Must use a Dataset to make use of a DataRelation object
using(DataSet ds = new DataSet())
{
//Add tables
ds.Tables.AddRange(new DataTable[]{First.Copy(),Second.Copy()});
//Get Columns for DataRelation
DataColumn[] firstcolumns = new DataColumn[ds.Tables[0].Columns.Count];
for(int i = 0; i < firstcolumns.Length; i++)
{
firstcolumns[i] = ds.Tables[0].Columns[i];
}
DataColumn[] secondcolumns = new DataColumn[ds.Tables[1].Columns.Count];
for(int i = 0; i < secondcolumns.Length; i++)
{
secondcolumns[i] = ds.Tables[1].Columns[i];
}
//Create DataRelation
DataRelation r = new DataRelation(string.Empty,firstcolumns,secondcolumns,false);
ds.Relations.Add(r);
//Create columns for return table
for(int i = 0; i < First.Columns.Count; i++)
{
table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
}
//If First Row not in Second, Add to return table.
table.BeginLoadData();
foreach(DataRow parentrow in ds.Tables[0].Rows)
{
DataRow[] childrows = parentrow.GetChildRows(r);
if(childrows == null || childrows.Length == 0)
table.LoadDataRow(parentrow.ItemArray,true);
}
table.EndLoadData();
}
return table;
}
Удивительно, но когда я применил этот код, он работал только в нескольких случаях, а в других - неудачно.
Был один случай, я сравнивал две идентичные таблицы(но имеет другой источник), которые оба имеют:
- Одинаковое имя столбца &
DataType
- Одинаковое количество строк и столбцов
- Одинаковое значение в каждой ячейке
Только для того, чтобы был возвращен новый стол , который фактически имеет тот же состав , что и две оригинальные таблицы!
Что я пропустил , возможно ?
Возможно ли, что две идентичных таблицы (общие функции, о которых я упоминал выше) могут иметь другие различные свойства (которые не видны пользователям "глаза)?
Или, возможно, это действительно плохой метод ?Каковы возможные альтернативы?
EDITED
- Обе таблицы имеют одинаковый примитивный тип данных, такой как:
System.String
, System.Int32
, System.DateTime
- Этот код работает не на всех протестированных мною образцах
- Вот экран печати 1 образца (с использованием
DataSet
Визуализатор)
![enter image description here](https://i.stack.imgur.com/cpjjg.png)