0

を使用してCustomDataRowEqualityComparer()、列数が異なる2つのデータテーブルを比較していますが、いくつかの列を共有しています:

var result= maindatatable.AsEnumerable().Except(dt.AsEnumerable(), new CustomDataRowEqualityComparer()).CopyToDataTable();

結果のデータテーブルに列のみを含めるにはどうすればよいdtですか?、上記のコンテキストで

結果データテーブルには、maindatatable

これが私の比較クラスです

public class CustomDataRowEqualityComparer : IEqualityComparer<DataRow>
    {
        public bool Equals(DataRow x, DataRow y)
        {
            return ((int)x["id"] == (int)y["id"]);
        }

        public int GetHashCode(DataRow obj)
        {
            return ((int)obj["id"]);
        }

    }

maindatatable存在しないすべての行を返しますdt

4

1 に答える 1

1

そのため、メインテーブルに含まれていないすべての行を含むメインテーブルを返す方法がわかりませんdt、の列がありdtます。

maintable一般に、 からの行を別の からの列とともに選択することはできませんDataTable。したがって、(すべての列を作成するためにdt使用する)の新しいインスタンスにこれらの行を入力する必要があります。dt.Clone()

たとえば、テーブルの列dtも存在すると仮定しますがmaintable、その逆はありません):

var result = maindatatable.AsEnumerable()
    .Except(dt.AsEnumerable(), new CustomDataRowEqualityComparer());
var dt2 = dt.Clone();
foreach(DataRow mainRow in result)
{
    var newRow = dt2.Rows.Add();
    foreach (DataColumn col in dt2.Columns)
        newRow[col] = mainRow[col.ColumnName];
}
于 2013-03-19T11:59:56.750 に答える