30 Haziran 2020 Salı

HashSet Sınıfı - IEqualityComparer Alabilir

Giriş
Şu satırı dahil ederiz.
using System.Collections.Generic;
Constructor - Collection
Şöyle yaparız.
List<Foo> list = ...;
HashSet set = new HashSet<Foo>(list);
Constructor - IEqualityComparer
Bir compararer kodlarız. Şöyle yaparız.
class PointComparer : IEqualityComparer<Point> {
  public bool Equals(Point x, Point y) {
    return x.X == y.X && x.Y == y.Y;
  }

  public int GetHashCode(Point obj) {
    return obj.X << 16 | obj.Y;
  }
}
Şöyle yaparız
HashSet<Point> set = new HashSet<Point>(new PointComparer());
Add metodu
Şöyle yaparız.
set.Add(new Foo(...));
Diğer
1. GetHashCode metodu
Eğer IEqualityComparer arayüzünü constructor'a vermiyorsak HashSet'e eklenen nesnenin Equasl ve GetHashCode metodu yazılmalıdır. Şöyle yaparız.
public class Employe
{
  public Employe() {
  }

  public string Name { get; set; }

  public override string ToString()  {
    return Name;
  }

  public override bool Equals(object obj) {
    return this.Name.Equals(((Employe)obj).Name);
  }

  public override int GetHashCode() {
    return this.Name.GetHashCode();
  }
}
2. Linq ile kullanımı
Şöyle yaparızz
HashSet<Employe> hashSet = new HashSet<Employe>(...);
...
HashSet<Employe> hashSetB = new HashSet<Employe>(...);
...

var union = hashSet.Union<Employe>(hashSetB).ToList();
var inter = hashSet.Intersect<Employe>(hashSetB).ToList();
var except = hashSet.Except<Employe>(hashSetB).ToList();

Hiç yorum yok:

Yorum Gönder