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);
}
答案 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