我有一个具有Name属性的Person类。 我有一个人的集合。 我有一个方法来添加一个新的人,但我需要检查集合已经包含的人。行内比较器
我想使用coll.Contains(newPerson,[here is the comparer])
比较器将比较名称属性。 是否可以在不创建实现IEqualityComparer的新类的情况下进行内联(匿名)比较?
我有一个具有Name属性的Person类。 我有一个人的集合。 我有一个方法来添加一个新的人,但我需要检查集合已经包含的人。行内比较器
我想使用coll.Contains(newPerson,[here is the comparer])
比较器将比较名称属性。 是否可以在不创建实现IEqualityComparer的新类的情况下进行内联(匿名)比较?
在这种情况下,你不想重复Person
对象,并希望在该集合为一组动作,你可以调用它的Add
方法做检查时使用HashSet<Person>
,而是如果这样的人已经存在。为此,您可以在班级中实施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.
}
注意这不会给你多comparers的灵活性,但这种方式,您将不必创建一个实现IEqualityComparer<T>
的新类。
您可以改用linq。
bool contains = coll.Any(p => p.Name == newPerson.Name);
您可以根据需要在这里添加任何条件。例如WaiHaLee指出你可以做比较忽视的情况。
bool contains = coll.Any(p => p.Name.Equals(newPerson.Name, StringComparison.OrdinalIgnoreCase));
我建议你使用不变文化进行名称比较,并忽略大小写,以便“约翰史密斯”将与“约翰史密斯”比较并处理[土耳其语I](https://msdn.microsoft.com/en-我们/库/ ms994325.aspx#cltsafcode_topic4)。 –
你对给定的集合进行了哪些操作? –