0

STUDENT というテーブルにクエリを実行しています。STUDENT_ID と TIME (両方とも文字列) の 2 つの値を取得したいと考えています。ただし、STUDENT_ID の個別の値のみが必要です。STUDENT_ID のみで Distinct() を使用すると、一意の値が得られます。しかし、TIME を含めた瞬間にすべての値が表示されます。これは、テーブル内の時間がすべて異なるためです。また、独自の Comparer クラスを作成し、インスタンスを Distinct() に渡そうとしました。

  public class MyCompare : IEqualityComparer<IQueryable>
{

    public bool Equals(DataRow x, DataRow y)
    {
        return (x.Field<string>("STUDENT_ID") == y.Field<string>("STUDENT_ID"));
    }

    public int GetHashCode(DataRow obj)
    {
        return obj.ToString().GetHashCode();
         }


}

ただし、4つのエラーが発生します。

1)。2つの値でdistinctを使用する方法はありますか? (STUDENT_IDだけだとソートされるので)STUDENT_IDの一意の値を表示し、対応するTIMESを表示したい。

または.. 2. 動作するコンペアラーを作成するにはどうすればよいですか? 次のエラーが表示されます。

a. エラー 1 'System.Linq.IQueryable' には 'Distinct' の定義が含まれておらず、最適な拡張メソッド オーバーロード 'System.Linq.ParallelEnumerable.Distinct(System.Linq.ParallelQuery, System.Collections.Generic.IEqualityComparer)' にはいくつかの定義があります無効な引数 C:\Users\KC\Desktop\SoulScanner\SoulScanner\SearchByTime.xaml.cs 360 23 SoulScanner

b. エラー 4 引数 1: 'System.Collections.Generic.IEnumerable' から 'System.Linq.IQueryable' に変換できません C:\Users\KC\Desktop\SoulScanner\SoulScanner\SearchByTime.xaml.cs 363 43 SoulScanner

c. エラー 2 インスタンス引数: 'System.Linq.IQueryable' から 'System.Linq.ParallelQuery' に変換できません C:\Users\KC\Desktop\SoulScanner\SoulScanner\SearchByTime.xaml.cs 360 23 SoulScanner

d. エラー 3 'SoulScanner.dgvRecords.dgvRecords(System.Linq.IQueryable)' に一致する最適なオーバーロードされたメソッドには、いくつかの無効な引数があります C:\Users\KC\Desktop\SoulScanner\SoulScanner\SearchByTime.xaml.cs 363 28 SoulScanner

4

1 に答える 1

2

比較対象は実際に実装されている必要がありIEqualityComparer<DataRow>ます。クエリ全体ではなく、行を比較しています。

ただし、それが修正された後でGetHashCodeも、メソッドは壊れていToStringます。STUDENT_IDフィールドを使用するだけでなく、行自体に対する呼び出しの結果のハッシュを返します。ToString行内のすべてのフィールドの適切な文字列表現を思いついた場合、それは完全に壊れています。実際にクラス名(のデフォルトの動作ToString)を返すだけの場合は、壊れているのではなく役に立たない:)次のようなものを使用する必要があります。

public int GetHashCode(DataRow row)
{
    string id = row.Field<string>("STUDENT_ID");
    return id == null ? 0 : id.GetHashCode();
}

2つの値を区別したい場合は、ハッシュと等式の比較で両方を使用する必要があります。それだけです。同等性の比較には2つの同等性チェックがあり、両方が合格した場合にのみtrueを返します。ハッシュコードメソッドは、おそらく2つのハッシュ(各フィールドに1つ)を取得し、それらを組み合わせます。

// Compute hashes for field1 and field2
...
int hash = 17;
hash = hash * 31 + hashForField1;
hash = hash * 31 + hashForField2;
return hash;
于 2011-03-31T08:45:08.877 に答える