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

本文关键字:方法 查找 对象 何使用 IList Contains | 更新日期: 2023-09-27 18:28:56

我有一个公司类中的人员列表。

public class Company{
    IList<Person> persons;
}

然后我有一份公司名单,

IList<Company> companies;

现在我有了一个名字(说"Lasantha")。如果这个名字是公司中任何人名字的一部分,我想找到那个公司。我试着利用公司。Contains()方法。我高估了物体。Equals方法,在Person类中如下,

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

但这是行不通的。它并没有调用这个Equal方法。有人能帮帮我吗。

谢谢。

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

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

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

"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")));

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

您可以使用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; }
}

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

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

然后,根据msdn的说明,您可能还需要提供CompareTo(IComparable)。

当您可以将其作为时,我认为您不需要重写Equals

您应该使用where来筛选公司,然后使用"人员"列表中的"任意"来获得符合您的姓名标准的公司

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

您正在搜索

  1. 字符列表("Lasantha")
  2. 在人员列表中
  3. 在公司列表中

好吧,其他贡献者已经描述了如何正确地进行