2011-12-30 37 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