3

私は次のデータテーブルを持っています - としましょうMyTable:

Col1:    Col2:    Col3:    Col4:
1        abc      def      <null>
2        abc      def      ghi
1        abc      def      <null>
3        abc      def      <null>
1        abc      def      <null>

そして、私は個別の行を取得しようとしています:

Col1:    Col2:    Col3:    Col4:
1        abc      def      <null>
2        abc      def      ghi
3        abc      def      <null>

次のLINQステートメントを試しました:

MyTable = (From dr As DataRow In MyTable Select dr).Distinct.CopyToDataTable

しかし、繰り返される行を含む元のデータテーブルが返されます。

私は何を間違っていますか?どうすれば目的の出力を得ることができますか??

4

4 に答える 4

6

Distinctは、すべてがおよびの適切な実装を実装しているIEquatable、および/または実装しているオブジェクトに依存しています。クラスは...そうではありません。メソッド内で各列の値が等しいことを確認するのではなく、デフォルトの実装を使用するだけです。つまり、参照が等しいことを確認しますが、それはあなたが望むものではありません。GetHashCodeEqualsDataRowEquals

IEqualityComparerではメソッドを変更できないため、独自の を提供できますDataRow

そのインスタンスを to に提供すると、次のように動作するはずですDistinct

public class DataRowComparer : IEqualityComparer<DataRow>
{
    public bool Equals(DataRow x, DataRow y)
    {
        for (int i = 0; i < x.Table.Columns.Count; i++)
        {
            if (!object.Equals(x[i], y[i]))
                return false;
        }
        return true;
    }

    public int GetHashCode(DataRow obj)
    {
        unchecked
        {
            int output = 23;
            for (int i = 0; i < obj.Table.Columns.Count; i++)
            {
                output += 19 * obj[i].GetHashCode();
            }
            return output;
        }
    }
}
于 2013-01-04T21:35:14.857 に答える
2

このようにしてみてください。

var distinctRows = (from DataRow dRow in MyTable.Rows
                    select new {col1=dRow["Col1"],col2=dRow["Col2"], col3=dRow["Col3"], col4=dRow["Col4"]}).Distinct();

foreach (var row in distinctRows) 
{
 //
}
于 2013-01-04T21:37:06.630 に答える
1

@Servyの質問は本当にこれを行う正しい方法でしたが、Servyに感謝します! また、少なくともきれいに見える別の解決策も見つけました。

    MyTable = MyTable.DefaultView.ToTable(True)

これにより、個別のレコードのみを要求できますが、LINQ を介してそれを行うという元の要求によって否定されます - 将来この質問を見ている他の人のためにそれを追加すると考えました。

于 2013-01-04T22:01:57.520 に答える
1

問題は、すべてDataRowDataTable異なるオブジェクトであることです。それぞれがインスタンスです。

于 2013-01-04T21:36:19.300 に答える