2012-03-26 29 views
0

我有一個公司類人員列表。如何使用IList.Contains()方法查找對象

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

以這種方式覆蓋平等比較是錯誤的。

平等應該是傳遞的:如果

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

+0

謝謝你的解釋性答案。 – 2012-03-27 04:19:30

1

您需要重載Equals,以便將Person作爲參數。否則它將默認參考比較。

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

然後作爲msdn狀態,您可能需要提供CompareTo(IComparable的)爲好。

1

我不認爲你需要重載equals的時候就可以得到這個作爲

你應該用在哪裏過濾公司,然後使用任何人名單得到那些符合你的名字標準

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

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

您正在尋找

  1. 字符的列表( 「Lasantha」)
  2. 公司的名單內的人士
  3. 列表裏面

好,其他貢獻者已經描述瞭如何正確地做到這一點

相關問題