我有公司类内的人员名单。
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方法。有人可以帮帮我吗。
谢谢。
答案 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)
您正在搜索
好吧,其他贡献者已经描述了如何正确地做到这一点