2011-01-24 8 views
1

国の種類の項目のリストがあり、リストの特定の国と特定の国を検索しようとしていますが、IndexOf()メソッドは常に - 1。Silverlight上のリストの項目のインデックスが見つかりません

国オブジェクトは、次のようになります。私は、IndexOfメソッド()メソッドを使用しようとすると

public class Country 
    { 
     public string CountryCode { get; set; } 
     public string CountryName { get; set; } 
    } 

は、それから私は、次の操作を行います。

var newcountry = new Country 
        { 
         CountryCode = "VE", 
         CountryName = "VENEZUELA" 
        }; 
     var countries = ListBoxCountries.Items.Cast<Country>().ToList(); 

     if (countries.IndexOf(newcountry) == -1) 
      countries.Add(newcountry); 

は私が持つすでに満たさリストを持っていると仮定しましょう国と "ベネズエラ"がリストにある場合、IndexOf()メソッドは国を決して見つけません。

EDIT:

だから私はここにReSharperのから少しの助けを得て、彼はかつて私は()メソッドのEqualsをオーバーライドすることを彼に告げたこれを作った:

 public override bool Equals(object obj) 
     { 
      if (ReferenceEquals(null, obj)) return false; 
      if (ReferenceEquals(this, obj)) return true; 
      if (obj.GetType() != typeof (Country)) return false; 
      return Equals((Country) obj); 
     } 

     public bool Equals(Country other) 
     { 
      if (ReferenceEquals(null, other)) return false; 
      if (ReferenceEquals(this, other)) return true; 
      return Equals(other.CountryCode, CountryCode) && Equals(other.CountryName, CountryName); 
     } 

     public override int GetHashCode() 
     { 
      unchecked 
      { 
       return ((CountryCode != null ? CountryCode.GetHashCode() : 0)*397)^(CountryName != null ? CountryName.GetHashCode() : 0); 
      } 
     } 

そして、ここで別の質問が来る:それは大丈夫です2つのオブジェクトを比較するためにこれをすべて行うだけですか?

答えて

1

これは参考になると思われます。確認するにはCountryクラスのEquals();メソッドをオーバーライドする必要があります。

私はこのようなコードを使用したい:

public bool Equals(Country other) 
{ 
    return this.CountryName.Equals(other.CountryName); 
} 
+0

はい、IndexOfメソッドは、オブジェクトを比較するために)(等号を使用しています。したがって、IndexOfを使用する場合は、このメソッドをCountryクラスでオーバーライドする必要があります。 –

+0

いいえ、動作しません。たぶん私は他の何かを欠いているでしょう。 –

+0

'GetHashCode()'を実装する必要があるかもしれませんが、なぜ 'Equals()'が不十分なのか分かりません。 – Nate

0

IndexOfメソッドは、あなたがこの

var newcountry = new Country 
       { 
        CountryCode = "VE", 
        CountryName = "VENEZUELA" 
       }; 


bool country = ListBoxCountries.Items.Cast<Country>().FirstOrDefault(c=>c.CountryCode == newcountry.CountryCode && c.CountryName == newcountry.CountryName) 

if(country == null) 
    countries.Add(newcountry); 

やオブジェクトを比較することができますより良いovverrideのEquals()メソッドを使用できるオブジェクトに

を比較するための参照の等価を使用しているためです。

関連する問題