我有一个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);
}
}
}
答案 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);