如何使用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方法。有人能帮帮我吗。
谢谢。
以这种方式覆盖相等比较是错误的
相等应该是可传递的:如果
"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"));
您正在搜索
- 字符列表("Lasantha")
- 在人员列表中
- 在公司列表中
好吧,其他贡献者已经描述了如何正确地进行