Не удается найти индекс элемента в списке на Silverlight - PullRequest
1 голос
/ 24 января 2011

У меня есть список элементов типа Country, и я пытаюсь найти индекс и конкретную страну в списке, но метод IndexOf () всегда возвращает -1.

Объект Country выглядит следующим образомthis:

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

Затем, когда я пытаюсь использовать метод IndexOf (), я делаю следующее:

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

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

Допустим, у меня уже есть заполненный список со странами и "Венесуэла "находится в списке, метод IndexOf () никогда не находит страну.

РЕДАКТИРОВАТЬ:

Так что я получил небольшую помощь от 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 голос
/ 24 января 2011

Я подозреваю, что это связано с проблемой ссылки. Вам нужно переопределить метод Equals(); в вашем классе Country для проверки.

Я бы использовал такой код:

public bool Equals(Country other)
{
    return this.CountryName.Equals(other.CountryName);
}
0 голосов
/ 24 января 2011

Это потому, что 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);

Или вы можете улучшить метод Equverride () для сравнения объектов.

...