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

时间:2012-03-26 09:45:58

标签: c# .net .net-3.5

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

public class Company{
    IList<Person> persons;
}

然后我有一个公司名单,

IList<Company> companies;

现在我有了一个名字(比如说“Lasantha”)。如果这个名字是公司任何人姓名的一部分,我想找到那家公司。我尝试过使用companies.Contains()方法。我重写了object.Equals方法,在Person类中,就这样,

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

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

谢谢。

5 个答案:

答案 0 :(得分:5)

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

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

"FooBar".Equals("Foo") == true

那么它也必须坚持

"Foo".Equals("FooBar") == true

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

所以,考虑到覆盖Equals不是解决方案,应该你做什么?

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

var companiesWithPeopleWithLasanthaInTheirName = 
    companies.Where(c => c.persons.Any(p => p.Name.Contains("Lasantha")));

然而,上面的比较是区分大小写的,所以如果你不需要它,你必须调整它;这个问题有一个答案:Case insensitive 'Contains(string)'

答案 1 :(得分:2)

你可以使用Linq,比如

var temp = companies.Where(p => p.People.Any(q => q.Name.Contains("Lasantha")));

这是完整的例子;

public class Example
{
    private IList<Company> companies;
    public Example()
    {
        Person p1 = new Person(){Name = "Lasantha"};
        Person p2 = new Person(){Name = "Red Kid"};
        Company comp = new Company();
        comp.People = new List<Person>();

        comp.People.Add(p1);
        comp.People.Add(p2);

        companies = new List<Company>();
        companies.Add(comp);

        var temp = companies.Where(p => p.People.Any(q => q.Name.Contains("Lasantha")));
    }
}

public class Company
{
    public IList<Person> People
    {
        get;
        set;
    }
}

public class Person
{
    public string Name { get; set; }
}

答案 2 :(得分:1)

您需要重载Equals,以便将Person作为参数。否则它将默认为参考比较。

public override bool Equals(Person p)
{
   //...
}

然后,如msdn所述,您可能还需要提供CompareTo(IComparable)。

答案 3 :(得分:1)

我不认为你需要覆盖Equals才能得到它

您应该使用过滤公司的位置,然后在人员列表中使用任意来获取符合您姓名标准的公司

companies.Where(c => c.persons.Any(p => p.Name.Contains("Value here"));

答案 4 :(得分:0)

您正在搜索

  1. 一个字符列表(“Lasantha”)
  2. 在人员列表中
  3. 在公司列表中
  4. 好吧,其他贡献者已经描述了如何正确地做到这一点