2011-12-30 72 views
-5

IndexOf对列表的最后一个元素返回1。为什么?
此代码不被我使用。我只是通过下面提到的代码给你们一个关于我的问题背景的想法 E.g.清单:List.IndexOf返回1 c#

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

您的示例代码将导致编译时错误。 'abc'列表中没有项目,因此按索引访问会导致异常。 – Oded 2011-12-30 09:07:31

+0

你在abc [0] = 1上得到一个argumentsoutofrangeexception;正如Oded所说的那样, – Peter 2011-12-30 09:11:07

+0

。如果你打算包含代码,工作代码总是很好。或者至少有一些伪代码来表明发生了什么(例如,一行说“从数据库中添加100个值列表”或其他东西。如果你的代码无效并且不包含你的错误,那么它很难找到问题... – Chris 2011-12-30 09:13:10

回答

4

List.IndexOf()方法返回列表中元素(项)的第一次出现,如果一个元件被发现。如果您的列表包含重复元素,则可以使用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); 
    } 
1

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

如果问题仍然存在,那么您可以发布代码以重新生成问题。您发布的当前代码不会按原样运行 - 例如,如果您的代码中没有至少添加4个元素,那么代码中的abc[3] = 41等行不起作用。

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扩展方法。如果您想在其他上下文中运行此代码,请删除并替换。

+0

没有这个代码是我没有使用 – RollerCosta 2011-12-30 09:15:11

+0

然后检查是否最后一个元素是与列表中第一个索引相同。我怀疑它可能会......(或者你的名单只有两个元素;-))。 – Chris 2011-12-30 09:18:20

+0

Downvote无评论? – Chris 2011-12-30 09:31:37

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); 
} 
1


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

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

我猜他得到的代码没有编译或一次投票你编辑它来编译展示了这个问题。如果这是被接受的答案,那么问题显然不是关于IndexOf,而是关于无法在每个循环中引用正确的元素。问题非常明确:“IndexOf为列表的最后一个元素返回1,为什么?”并且在任何世界上都不应该回答这个问题:“不要使用它”。它显然解决了他的问题,但不是问题中的问题。 – Chris 2011-12-30 09:31:07

+1

@Chris在stack overoverflows上搜索问题,人们通过给出例子来解释他们的问题,让我们更容易,他们的例子没有找到正确的格式/ syntex。 – RollerCosta 2011-12-30 09:42:59

+0

在编辑代码kannas之前,假设你们足够聪明。现在我认为Kannas编辑了他的代码以便更好地呈现。 – RollerCosta 2011-12-30 09:46:00