Попытка вызова метода int IList <Location>.IndexOf (элемент Location) - PullRequest
0 голосов
/ 20 марта 2012

У меня есть IList Generic, который я пытаюсь выяснить, и мне трудно найти правильный формат для вызова метода IndexOf в классе Locations: IList.

namespace Ilistprac
{
   class IList2
   {
      static void Main(string[] args)
      {

        string sSite = "test";

        Locations test = new Locations();

        test.Add(sSite)
      }
    }

  public class Location
  {
      public Location()
      {

      }

      private string _site = string.Empty;
      public string Site
      {
        get { return _site; }
        set { _site = value; }
      }
   }


  public class Locations : IList<Location>
  {
    List<Location> _locs = new List<Location>();

    public Locations() { }


    int IList<Location>.IndexOf(Location item)
    {
       return _locs.IndexOf(item);
    }

   public void Add(string sSite)
   {
     Location loc = new Location();
     loc.Site = sSite;
     _locs.Add(loc);
   }
  }
}

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Не совсем понятно, какой у вас вопрос. Я предполагаю из вашего комментария //nothing, что ваш вопрос является одним из следующих:


1

Я реализовал IList<Location>.IndexOf(Location) в своем классе Locations, но я получаю ошибку компилятора при попытке вызвать метод в экземпляре класса Locations.

Если это ваш вопрос, тогда у вас есть два варианта. Вы можете изменить реализацию с явной реализации элемента интерфейса на неявную one:

public int IndexOf(Location item)
{
   return _locs.IndexOf(item); 
}

Кроме того, вы можете получить доступ к методу через ссылку типа IList<Location>, а не ссылку Locations:

Locations locations = GetLocations();
Location location = GetLocation();
int index = ((IList<Location>)locations).IndexOf(location);

Первый подход более распространен и обычно менее многословен.


2

Я реализовал IList<Location>.IndexOf(Location) в своем классе Locations, делегировав вызов обернутому члену List<Location> этого класса, но когда я вызываю метод, он всегда возвращает -1, указывая, что список не содержит пройденное местоположение.

Если это ваш вопрос, это потому, что вы не переопределили метод Equals(object) в своем классе Location и пытаетесь найти местоположение, подобное этому:

Locations locations = GetLocations();
string site = GetSite();
Location location = new Location { Site = site };
int index = ((IList<Location>)locations).IndexOf(location);

Здесь индекс всегда будет равен -1, поскольку IndexOf проверяет объекты местоположения, используя ссылочное равенство . Вы можете переопределить «Равно», если хотите считать два местоположения равными, если и только если их свойства сайта равны.

Если это отношение равенства не является универсально допустимым для типа Location, вы не должны этого делать. В этом случае вы можете использовать linq, чтобы найти местоположение, сайт которого соответствует требуемому значению:

Location location = locations.Where(x => x.Site == site).FirstOrDefault;

Если вам нужен индекс местоположения, просто сделайте это (при условии, что locations не может законно содержать нулевое значение):

Location location = locations.Where(x => x.Site == site).FirstOrDefault;
int index = location == null ? -1 : locations.IndexOf(location);
1 голос
/ 20 марта 2012

Члены класса по умолчанию настолько закрыты, насколько это возможно, поэтому, поскольку вы ничего не указали для метода, он закрыт.

Сделайте это общедоступным, и вы можете вызвать его из-за пределов самого класса:

public int IndexOf(Location item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...