在线比较
Inline Comparer
我有一个 class 人,名字是 属性。
我有一群人。
我有一个添加新人的方法,但我需要检查集合是否已包含该人。
我想使用 coll.Contains(newPerson,[here is the comparer])
,比较器将对名称 属性 进行比较。
是否可以在不创建新的 class 实现 IEqualityComparer 的情况下(匿名)进行内联比较?
您可以改用 linq。
bool contains = coll.Any(p => p.Name == newPerson.Name);
您可以根据需要在此处添加任何条件。例如,正如 WaiHaLee 指出的那样,您可以比较忽略大小写。
bool contains = coll.Any(p => p.Name.Equals(newPerson.Name, StringComparison.OrdinalIgnoreCase));
如果您不想要重复的 Person
对象,并且希望将该集合作为一个集合进行操作,您可以使用 HashSet<Person>
而不是调用它的 Add
方法将检查这样的人是否已经存在。为此,您可以在 class 中实现 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.
}
请注意,这不会为您提供多个比较器的灵活性,但这样您就不必创建一个新的 class 实现 IEqualityComparer<T>
。
我有一个 class 人,名字是 属性。 我有一群人。 我有一个添加新人的方法,但我需要检查集合是否已包含该人。
我想使用 coll.Contains(newPerson,[here is the comparer])
,比较器将对名称 属性 进行比较。
是否可以在不创建新的 class 实现 IEqualityComparer 的情况下(匿名)进行内联比较?
您可以改用 linq。
bool contains = coll.Any(p => p.Name == newPerson.Name);
您可以根据需要在此处添加任何条件。例如,正如 WaiHaLee 指出的那样,您可以比较忽略大小写。
bool contains = coll.Any(p => p.Name.Equals(newPerson.Name, StringComparison.OrdinalIgnoreCase));
如果您不想要重复的 Person
对象,并且希望将该集合作为一个集合进行操作,您可以使用 HashSet<Person>
而不是调用它的 Add
方法将检查这样的人是否已经存在。为此,您可以在 class 中实现 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.
}
请注意,这不会为您提供多个比较器的灵活性,但这样您就不必创建一个新的 class 实现 IEqualityComparer<T>
。