C#の等しく、GetHashCodeメソッドで
和GetHashCodeメソッドは等しいです
各実装は、次の規則に従う必要があり等しいです。
- 再帰(再帰): x.equals(X-)がtrueを返す必要があります。
- 対称(左右対称): x.equals(Y)のはy.equals(X)も真であり、真です。
- :推移(推移) x.equals(y)がtrueを返した場合、真を返すのx、yおよびzの非ヌル値の任意のアプリケーションで、及びy.equals(Z)、次いで、x.equals(z)がtrueを返す必要があります。
- 一貫性(整合性): 別のオブジェクトへの複数の比較対象場合、結果は常に長い修飾されていないアプリケーションのオブジェクトxとyと同じであるについて、x.equals(y)は連続通話x.equals(y)は同じ値Lを返します。 。
- 非ヌル(null以外): xがnullでない場合、Yがnullについて、x.equals(y)が偽でなければなりません
GetHashCodeメソッド:
- 二つのオブジェクトは、メソッドが同じハッシュコードの整数を生成しなければならない任意のオブジェクトに二つのオブジェクト次に、比較の方法は等しい等しくに従って等しいです。
- 我々は、変更するオブジェクトなかった場合は、同じハッシュコードを整数を返すために複数の呼び出しを使用しています。同じアプリケーション内で複数回実行、各整数実行リターンは一致しないことがあります。
- 2つのオブジェクトが方法による比較に等しいとき場合ではない整数で、そのオブジェクトのハッシュコード二つのオブジェクトのメソッドを呼び出す、等しくありません。しかし、異なる整数を持っているさまざまなオブジェクトは、ハッシュテーブルのパフォーマンスを向上させることが可能です。
達成されたIEqualityComparer
のは、さらに私たちの目標比較データを達成するために、学生のクラスを作成してみましょう
public class Student
{
public string Name { get; set; } public int Age { get; set; } }
私たちは、以下の方法が明確なコードを通して濾過したでしょう。
class Program
{
static void Main(string[] args) { List<Student> students = new List<Student> { new Student{ Name = "MR.A", Age = 32}, new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count());//distinctStudents has Count = 3 Console.ReadLine(); } }
私たちは、このようので、我々は望ましい結果に到達...同じデータオブジェクトを無視することで達成する必要がありますが、私たちのスケジュール結果を満たしていませんでした。それが明確なデフォルトの比較は、オブジェクトへの参照ですので。その後、我々は我々の予想を達成するために変更します効果。
デフォルトの等号によって次の動作があります。
- インスタンスが参照型である場合は、同じ、等号は真の参照のみが返されます。
- インスタンスは、値型である場合、それは同じである、唯一の唯一の型と値場合にtrueを返しますが等しいです。
個別(IEnumerableを、されたIEqualityComparer)
値を比較するために指定されたIEqualityComparerを使用して、非反復配列要素に戻ります。
型パラメータ
-
要素型のTSOURCEソース。
パラメータ
- ソース IEnumerableを要素から重複配列を除去します。
-
比較演算 されたIEqualityComparerされたIEqualityComparer比較値。
リターン
- IEnumerableを
別個の要素を含むIEnumerableをソース配列。
私たちは、次のコードを見て
public class StudentComparator : EqualityComparer<Student> { public override bool Equals(Student x,Student y) { return x.Name == y.Name && x.Age == y.Age; } public override int GetHashCode(Student obj) { return obj.Name.GetHashCode() * obj.Age; } }
上記2つのコードスニペットは、GetHashCodeメソッドが同じハッシュコードをtrueを返し、戻り等しい場合、2つのオブジェクトが等しいと見なされます。
equalsメソッドおよびGetHashCodeメソッドをオーバーライド
var stu1 = new Student { Name = "MR.A", Age = 32 };
var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //false because it's reference Equals
予期しない結果の上記のコード・スニペットの結果を実行した後。我々は、所望の結果を達成するためにコードを実装し続ける....
public class Student
{
public string Name { get; set; } public int Age { get; set; } public override bool Equals(object obj) { var stu = obj as Student; if (stu == null) return false; return Name == stu.Name && Age == stu.Age; } public override int GetHashCode() { return Name.GetHashCode() * Age; } } var stu1 = new Student { Name = "MR.A", Age = 32 }; var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //result is true
私たちは、その後、ろ過すると、クエリのLINQ個別のメソッドを使用して、等しく、GetHashCodeメソッドをチェックします
List<Student> students = new List<Student>
{
new Student{ Name = "MR.A", Age = 32},
new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count()); //distinctStudents has Count = 2
和GetHashCodeメソッドは等しいです
各実装は、次の規則に従う必要があり等しいです。
- 再帰(再帰): x.equals(X-)がtrueを返す必要があります。
- 対称(左右対称): x.equals(Y)のはy.equals(X)も真であり、真です。
- :推移(推移) x.equals(y)がtrueを返した場合、真を返すのx、yおよびzの非ヌル値の任意のアプリケーションで、及びy.equals(Z)、次いで、x.equals(z)がtrueを返す必要があります。
- 一貫性(整合性): 別のオブジェクトへの複数の比較対象場合、結果は常に長い修飾されていないアプリケーションのオブジェクトxとyと同じであるについて、x.equals(y)は連続通話x.equals(y)は同じ値Lを返します。 。
- 非ヌル(null以外): xがnullでない場合、Yがnullについて、x.equals(y)が偽でなければなりません
GetHashCodeメソッド:
- 二つのオブジェクトは、メソッドが同じハッシュコードの整数を生成しなければならない任意のオブジェクトに二つのオブジェクト次に、比較の方法は等しい等しくに従って等しいです。
- 我々は、変更するオブジェクトなかった場合は、同じハッシュコードを整数を返すために複数の呼び出しを使用しています。同じアプリケーション内で複数回実行、各整数実行リターンは一致しないことがあります。
- 2つのオブジェクトが方法による比較に等しいとき場合ではない整数で、そのオブジェクトのハッシュコード二つのオブジェクトのメソッドを呼び出す、等しくありません。しかし、異なる整数を持っているさまざまなオブジェクトは、ハッシュテーブルのパフォーマンスを向上させることが可能です。
達成されたIEqualityComparer
のは、さらに私たちの目標比較データを達成するために、学生のクラスを作成してみましょう
public class Student
{
public string Name { get; set; } public int Age { get; set; } }
私たちは、以下の方法が明確なコードを通して濾過したでしょう。
class Program
{
static void Main(string[] args) { List<Student> students = new List<Student> { new Student{ Name = "MR.A", Age = 32}, new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count());//distinctStudents has Count = 3 Console.ReadLine(); } }
私たちは、このようので、我々は望ましい結果に到達...同じデータオブジェクトを無視することで達成する必要がありますが、私たちのスケジュール結果を満たしていませんでした。それが明確なデフォルトの比較は、オブジェクトへの参照ですので。その後、我々は我々の予想を達成するために変更します効果。
デフォルトの等号によって次の動作があります。
- インスタンスが参照型である場合は、同じ、等号は真の参照のみが返されます。
- インスタンスは、値型である場合、それは同じである、唯一の唯一の型と値場合にtrueを返しますが等しいです。
個別(IEnumerableを、されたIEqualityComparer)
値を比較するために指定されたIEqualityComparerを使用して、非反復配列要素に戻ります。
型パラメータ
-
要素型のTSOURCEソース。
パラメータ
- ソース IEnumerableを要素から重複配列を除去します。
-
比較演算 されたIEqualityComparerされたIEqualityComparer比較値。
リターン
- IEnumerableを
別個の要素を含むIEnumerableをソース配列。
私たちは、次のコードを見て
public class StudentComparator : EqualityComparer<Student> { public override bool Equals(Student x,Student y) { return x.Name == y.Name && x.Age == y.Age; } public override int GetHashCode(Student obj) { return obj.Name.GetHashCode() * obj.Age; } }
上記2つのコードスニペットは、GetHashCodeメソッドが同じハッシュコードをtrueを返し、戻り等しい場合、2つのオブジェクトが等しいと見なされます。
equalsメソッドおよびGetHashCodeメソッドをオーバーライド
var stu1 = new Student { Name = "MR.A", Age = 32 };
var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //false because it's reference Equals
予期しない結果の上記のコード・スニペットの結果を実行した後。我々は、所望の結果を達成するためにコードを実装し続ける....
public class Student
{
public string Name { get; set; } public int Age { get; set; } public override bool Equals(object obj) { var stu = obj as Student; if (stu == null) return false; return Name == stu.Name && Age == stu.Age; } public override int GetHashCode() { return Name.GetHashCode() * Age; } } var stu1 = new Student { Name = "MR.A", Age = 32 }; var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //result is true
私たちは、その後、ろ過すると、クエリのLINQ個別のメソッドを使用して、等しく、GetHashCodeメソッドをチェックします
List<Student> students = new List<Student>
{
new Student{ Name = "MR.A", Age = 32},
new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count()); //distinctStudents has Count = 2