试图在IList中获取索引位置的问题

时间:2012-03-22 19:49:24

标签: c# .net c#-4.0

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

        Locations test = new Locations();
        Location loc = new Location();
        string sSite = "test";
        test.Add(sSite);
        string site = loc.Site; 
        Location finding = test.Where(i => i.Site == site).FirstOrDefault();
        int index = finding == null ? -1 : test.IndexOf(finding); 
    }
}

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() { }

    public int IndexOf(Location item)
    {

        return _locs.IndexOf(item);

    }
    //then the rest of the interface members implemented here in IList
    public void Add(string sSite)
    {
        Location loc = new Location();
        loc.Site = sSite;

        _locs.Add(loc);
    }
  }

  IEnumerator<Location> IEnumerable<Location>.GetEnumerator()
    {
        return _locs.GetEnumerator();
    }

我在这篇文章中得到了一些帮助:Trying to call int IList<Location>.IndexOf(Location item) method

我试图让这个工作,但我总是得到-1作为索引号。我知道字符串site = loc.Site;在意识到之后是空的,所以我不知道如何从IList获取索引。

为了清理我想要完成的任务,我想学习如何使用IList接口成员,我开始使用IndexOf接口。

IList不仅仅是“sSite”,而且我只是将列表简化为“sSite”,仅用于示例目的。

所以在学习的过程中,我在路上遇到了这个磕磕碰碰,并且盯着代码看了几天(是的,我休息一下,看看其他的东西,不要让自己疲惫不堪)。

所以主要的问题是我一直得到index = -1。

2 个答案:

答案 0 :(得分:4)

我不清楚你的意图是什么,但是在代码片段中“loc”从未使用过,因为你在“添加”方法中创建了一个新的Location而“网站”是(就像你一样)我注意到)总是空的,但在“添加”方法中,您传入一个值并将其设置在新创建的实例上,因此除非您将string.Empty作为值传递,否则比较i.Site == site始终为false 。如果删除它们并重写为:

Locations test = new Locations();
string sSite = "test";
test.Add(sSite);
Location finding = test.Where(i => i.Site == sSite).FirstOrDefault();
int index = test.IndexOf(finding); 

然后返回0作为索引。

答案 1 :(得分:2)

假设您在开头就有这个:

Location loc = new Location();
loc.Site = "test";

您将获得索引。

也有点令人困惑,因为你不清楚你想在这里完成什么。 请注意这行代码:

test.Where(i => i.Site == site).FirstOrDefault();

只有在以下情况属实时才会返回值:“i.Site == site”,当然如果您提供列表中不存在的内容,则不会发生这种情况。