12 Aralık 2017 Salı

IEqualityComparer Arayüzü

Giriş
Açıklaması şöyle.
If you want to compare sequences of objects of some custom data type, you have to implement the IEqualityComparer generic interface in a helperclass.
IEquatable arayüzü IEqualityComparer arayüzünden farklıdır. IEquatable nesnemizi kendi tipinden bir başka nesne ile karşılaştırır. IEqualityComparer ise iki nesneyi birbiriyle karşılaştırır.

Bu arayüz genellikle hash yöntemini kullanan veri yapıları (Dictionary, HashSet vb.) için gereklidir. Elimizde şöyle bir sınıf olsun
public class Employee 
{
  public string Name { get; set; }
  public int Age { get; set; }
}
Arayüzü şöyle gerçekleştiririz.
public class EmployeeComparer : IEqualityComparer<Employee>{
  ...
}
Equals metodu
Şöyle yaparız.
public bool Equals(Employee x, Employee y)
{
  return string.Equals(x.Name, y.Name);
}
GetHashCode metodu
Şöyle yaparız.
public int GetHashCode(Employee obj)
{
  return obj.Name.GetHashCode();
}
İki değeri birleştirmek için şöyle yaparız.
public override int GetHashCode
{
  return this.FirstName.GetHashCode() ^ this.LastName.GetHashCode()
}
Aslında GetHashCode içindeki algoritma çok değişkenlik gösterebiliyor. Bir sürü saçma sapan bit kaydırmalar yapan bir MSDN örneği şöyle. Daha farklı seçenekleri gösteren örnekler şöyle.

Hiç yorum yok:

Yorum Gönder