2012-03-26 13 views
0

私は会社クラス内のPersonのリストを持っています。IList.Contains()メソッドを使用してオブジェクトを見つける方法

public class Company{ 
    IList<Person> persons; 
} 

は、その後、私は今、私は名前(たとえば "Lasantha")を有する

IList<Company> companies; 

、企業のリストを持っています。この名前が会社の人の名前の一部であれば、私はその会社を探しています。私はcompanies.Contains()メソッドを使って試しました。私はオブジェクトをオーバーライドしました。これはPersonクラス内のEqualsメソッドです。

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 

しかし、この場合には、あなたが「FooBarのが」含まれているので、推移を中断しますContainsを使用していることを保持しなければならない場合"Foo"が、 "Foo"には "FooBar"は含まれていません。それとは別に、クラスのオブジェクト間のすべての最後の比較が同じセマンティクス(この場合は非常に疑わしい)を持たない限り、クラスのEqualsメソッドをオーバーライドしないでください。

したがって、Equalsをオーバーライドすることが解決策ではないとすれば、あなたは何をにする必要がありますか?あなたはどうしますか?

一つの便利な方法は、LINQを使用することです:

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

上記の比較は大文字と小文字が区別されるので、あなたはそれができないする必要がある場合は、それを微調整する必要があるが、私はあなたがオーバーライドする必要はないと思うCase insensitive 'Contains(string)'

+0

ディスクリートな答えをありがとう。 –

1

Equalsをオーバーロードして、Person asパラメータを取得する必要があります。それ以外の場合は、参照の比較がデフォルトになります。

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

はその後msdn状態として、あなたにもCompareTo(IComparableを)を提供する必要があるかもしれません。

1

あなたが会社をフィルタリングして、人のリストにどれを使用する場所使用する必要があります

としてこれを取得することができたときに等しい:この問題の答えがありますあなたはLINQを使用することができますあなたの名前の基準

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

に一致するものを取得するには、ここで

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. 文字のリストを検索している

まあ、他の投稿者は既に正しくそれを行う方法を説明しました

関連する問題