List.IndexOf返回1 c#

时间:2011-12-30 09:00:16

标签: .net

IndexOf为列表的最后一个元素返回1。为什么?
我不使用此代码。我只是通过下面提到的代码让你们了解我的问题背景 例如。列表:

 List<int> abc = new List<int>();
 abc.Add(1);
 abc.Add(2);
 abc.Add(41);
// i.e index 0 hold 1 index 1 hold 2 and index 3 hold 41
//abc[0] = 1;
//abc[1] = 2;
//abc[3] = 41;

然后检查索引,如:

foreach (int i in abc)
{
    //for first two index[0,1] IndexOf() works fine but when foreach loop hole i=41       then IndexOf() returns 1 i.e is index=1 why??
    int index = abc.IndexOf(i);
}

5 个答案:

答案 0 :(得分:4)

这实际上是您正在使用的代码吗? docs for List.Indexof说“返回List<T>中第一次出现值的从零开始的索引”,这意味着如果您的列表包含1,2,3,2那么您的索引将包含最后一个是3。

以下代码段(在Linqpad中可运行)演示了......

var abc =new List<int>();
abc.Add(1);
abc.Add(3);
abc.Add(42);
abc.Add(45);
abc.Add(3);

foreach(int i in abc)
{
    int index=abc.IndexOf(i).Dump();
}

输出是:

0
1
2
3
1

注意:Dump()是用于打印对象的有用的LinqPad扩展方法。如果要在其他上下文中运行此代码,请删除并替换。

答案 1 :(得分:4)

如果找到元素,

List.IndexOf()方法返回列表中第一次出现的元素(item)。如果您的列表包含重复元素,那么您可以使用List.IndexOf(item,index)继续搜索列表。

    var abc = new List<int>();
    abc.Add(1);
    abc.Add(2);
    abc.Add(41);
    abc.Add(2);
    int index=-1;
    foreach (int i in abc)
    {
        index = abc.IndexOf(i,index+1);
        Console.WriteLine(index);
    }

答案 2 :(得分:1)

IndexOf返回找到匹配项的第一个索引。您的最后一个元素值很可能已经存在于索引1处。请仔细检查列表中的所有值。

如果问题仍然存在,那么您可以发布代码以重新生成问题。您发布的当前代码不会按原样运行 - 例如,除非您在列表中添加了至少4个元素,否则代码中的abc[3] = 41行将无效。

答案 3 :(得分:1)

您的代码不起作用。这个例子将给出预期答案。

var abc = new List<int>(4);  
abc.Add(1);  
abc.Add(2);  
abc.Add(3);  
abc.Add(41);  

abc[0] = 1;
abc[1] = 2;
abc[3] = 41;


foreach (int i in abc)
{
   int index = abc.IndexOf(i);
}

答案 4 :(得分:1)


kannas用于循环而不是foreach。这样做我将避免IndexOf()方法

for(int i =0;i<abc.Count;i++)//use index i