В случае, если вы не хотите дублировать Person
объекты, и хотите работать на этой коллекции в виде набора, вы можете использовать вместо HashSet<Person>
, который при вызове его метода Add
будет делать чек, если такой человек уже существует. Для этого вы можете реализовать IEquatable<Person>
в своем классе. Это будет выглядеть примерно так:
public class Person : IEquatable<Person>
{
public Person(string name)
{
Name = name;
}
public string Name { get; private set; }
public bool Equals(Person other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return string.Equals(Name, other.Name, StringComparison.OrdinalIgnoreCase);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Person) obj);
}
public override int GetHashCode()
{
return (Name != null ? Name.GetHashCode() : 0);
}
public static bool operator ==(Person left, Person right)
{
return Equals(left, right);
}
public static bool operator !=(Person left, Person right)
{
return !Equals(left, right);
}
}
И теперь вы можете использовать его в HashSet<Person>
как этот:
void Main()
{
var firstPerson = new Person { Name = "Yuval" };
var secondPerson = new Person { Name = "yuval" };
var personSet = new HashSet<Person> { firstPerson };
Console.WriteLine(personSet.Add(secondPerson)); // Will print false.
}
Примечание это не даст вам гибкость нескольких компараторов, но таким образом вы не нужно будет создавать новый класс, реализующий IEqualityComparer<T>
.
Какие действия вы выполняете по данной коллекции? –