2015-10-18 84 views
1

我有一个具有Name属性的Person类。 我有一个人的集合。 我有一个方法来添加一个新的人,但我需要检查集合已经包含的人。行内比较器

我想使用coll.Contains(newPerson,[here is the comparer])比较器将比较名称属性。 是否可以在不创建实现IEqualityComparer的新类的情况下进行内联(匿名)比较?

+0

你对给定的集合进行了哪些操作? –

回答

1

在这种情况下,你不想重复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>的新类。

1

您可以改用linq。

bool contains = coll.Any(p => p.Name == newPerson.Name); 

您可以根据需要在这里添加任何条件。例如WaiHaLee指出你可以做比较忽视的情况。

bool contains = coll.Any(p => p.Name.Equals(newPerson.Name, StringComparison.OrdinalIgnoreCase)); 
+0

我建议你使用不变文化进行名称比较,并忽略大小写,以便“约翰史密斯”将与“约翰史密斯”比较并处理[土耳其语I](https://msdn.microsoft.com/en-我们/库/ ms994325.aspx#cltsafcode_topic4)。 –