如何使用IList.Contains()方法查找对象

Las*_*ara 0 .net c# .net-3.5

我有公司类内的人员名单.

public class Company{
    IList<Person> persons;
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个公司列表,

IList<Company> companies;
Run Code Online (Sandbox Code Playgroud)

现在我有一个名字(说"Lasantha").如果这个名字是公司任何人姓名的一部分,我想找到那家公司.我尝试过使用companies.Contains()方法.我在Person类中覆盖了object.Equals方法,如下所示,

public override bool Equals(object o)
        {
            var other = o as Person;
            return this.Name.ToLower().Contains(other.Name.ToLower());
        }
Run Code Online (Sandbox Code Playgroud)

但这不起作用.它也没有称这种Equal方法.有谁可以帮助我吗.

谢谢.

Jon*_*Jon 5

以这种方式覆盖相等比较是错误的.

平等应该是可传递的:如果

"FooBar".Equals("Foo") == true
Run Code Online (Sandbox Code Playgroud)

那么它也必须坚持下去

"Foo".Equals("FooBar") == true
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,你使用Contains哪个会破坏传递性,因为"FooBar"包含"Foo",但"Foo"不包含"FooBar".除此之外,你不应该Equals在类上覆盖该方法,除非该类的对象之间的每个最后比较具有相同的语义(在这种情况下看起来非常可疑).

所以,考虑到压倒Equals不是解决方案,你应该怎么做?

一种方便的方法是使用LINQ:

var companiesWithPeopleWithLasanthaInTheirName = 
    companies.Where(c => c.persons.Any(p => p.Name.Contains("Lasantha")));
Run Code Online (Sandbox Code Playgroud)

但是上面的比较是区分大小写的,所以如果你不需要它,你必须调整它; 这个问题有一个答案:不区分大小写'包含(字符串)'