试图调用int IList <location> .IndexOf(Location item)方法</location>

时间:2012-03-20 19:54:13

标签: generics c#-4.0

我有一个IList Generic我正在试图找出并且我很难找到正确的格式来调用Locations类中的IndexOf方法: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 个答案:

答案 0 :(得分:1)

默认情况下,类成员尽可能是私有的,因此您没有为该方法指定任何内容,它是私有的。

将其公之于众,您可以从课堂外调用它:

public int IndexOf(Location item)

答案 1 :(得分:1)

你的问题是什么并不完全清楚。我假设您的评论为//nothing,您的问题就是其中之一:


1:

  

我在IList<Location>.IndexOf(Location)类中实现了Locations,但是当我尝试在Locations类的实例上调用该方法时,我收到编译器错误。

如果这是您的问题,那么您有两种选择。您可以将实现从显式接口成员实现更改为隐式

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,表示该列表不包含传递的位置。

如果这是您的问题,那是因为您没有覆盖Location类中的Equals(object)方法,而您正试图找到这样的位置:

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

此处,index始终为-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);