2012-03-26 15 views
0

Ich habe eine Liste von Personen in einer Unternehmensklasse.So verwenden Sie die IList.Contains() - Methode, um ein Objekt zu finden

public class Company{ 
    IList<Person> persons; 
} 

Dann habe ich eine Liste von Unternehmen,

IList<Company> companies; 

Jetzt habe ich einen Namen (zB "Lasantha"). Wenn dieser Name Teil des Namens einer Person in einer Firma ist, möchte ich diese Firma finden. Ich habe versucht, mit companies.Contains() -Methode. Ich overrided die object.Equals Methode innerhalb der Klasse Person als diese,

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

Aber das funktioniert nicht. Es nennt diese Equal-Methode auch nicht. Kann mir bitte jemand helfen?

Vielen Dank.

Antwort

5

Das Überschreiben des Gleichheitsvergleichs auf diese Weise ist falsch.

Gleichheit sollte transitiv sein: wenn

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

dann auch, dass

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

jedoch halten müssen, in diesem Fall, dass Sie Contains verwenden, die die Transitivität brechen wird, weil „FooBar“ enthält "Foo", aber "Foo" enthält keine "FooBar". Abgesehen davon sollten Sie die Equals-Methode für eine Klasse nicht überschreiben, es sei denn, jeder letzte Vergleich zwischen Objekten dieser Klasse wird die gleiche Semantik haben (was in diesem Fall höchst zweifelhaft erscheint).

Also, das Überschreiben Equals ist nicht die Lösung, was sollte Sie tun?

Ein bequemer Weg ist LINQ zu verwenden:

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

jedoch der obige Vergleich ist case-sensitive, so dass, wenn Sie sie brauchen nicht zu sein, Sie zwicken müssen; gibt es eine Antwort auf diese Frage: Case insensitive 'Contains(string)'

+0

Danke für die beschreibende Antwort. –

1

Sie müssen Equals überladen, so dass eine Person als Parameter benötigt wird. Andernfalls wird standardmäßig der Referenzvergleich durchgeführt.

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

Dann als msdn Staaten, müssen Sie CompareTo (IComparable) als auch liefern.

1

Das glaube ich nicht, dass Sie außer Kraft setzen müssen, Equals, wenn Sie dies als

bekommen Sie, wo sollten mit den Unternehmen filtern und dann alle auf der Person Liste verwenden diejenigen gefunden, die Ihren Namen Kriterien wie

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

Sie verwenden Linq, um etwas zu bekommen

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

Hier ist die vollständige Beispiel;

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

Sie suchen nach

  1. eine Liste von Zeichen ("Lasantha")
  2. innerhalb einer Liste von Personen
  3. innerhalb einer Liste von Unternehmen

Well , andere Mitwirkende haben bereits beschrieben, wie man es richtig macht