2010-02-16 64 views
0

如何在不使用foreach循環的情況下從列表中檢索元素?如何檢索列表中的元素而不使用C#中的foreach循環?

+5

我想知道爲什麼你不希望使用的foreach。它可能會顯示一個細節,幫助我們更好地回答你的問題。 – 2010-02-16 04:14:37

+0

你想做什麼?爲什麼你不能使用foreach?列表索引器呢? – 2010-02-16 04:16:39

+0

我喜歡使用迭代 – ratty 2010-02-16 04:16:57

回答

6
var list = new List<int> { 1, 2, 3, 4, 5 }; 
for (int i = 0; i < list.Count(); i++) 
{ 
    var element = list[i]; 
} 

var list = new List<int> { 1, 2, 3, 4, 5 }; 
using (var enumerator = list.GetEnumerator()) 
{ 
    while (enumerator.MoveNext()) 
    { 
     var element = enumerator.Current; 
    } 
} 
+3

不要忘記處置枚舉循環。 – 2010-02-16 06:44:07

+0

謝謝 - 更新 – 2010-02-18 00:36:56

1

你說的名單,但你不指定List<T>類作爲this answer assumes(也,它可能會補充說,這個問題的答案使用Count()擴展方法。既然你知道這個類型是List<T>它更好地使用Count 財產)。

如果你總是使用IList<T>接口實現,那麼使用迭代索引然後使用該值訪問索引器的for循環可以正常工作。

但是,如果你正在處理IEnumerable<T>實現,這不會總是奏效。相反,您必須執行以下操作:

// Get the IEnumerator<T> from the list. 
IEnumerator<T> enumerator = list.GetEnumerable(); 

// Dispose if necessary. 
using (enumerator as IDisposable) 
{ 
    // Cycle while there are items. 
    while (enumerator.MoveNext()) 
    { 
     // Work with enumerator.Current here. 
    } 
} 

這是編譯器如何在編譯時展開foreach語句的方式。基本上,因爲IEnumerable<T>實現可以實現IDisposable,它試圖通過強制轉換爲IDisposable的準備是不測。如果它不能,那麼using語句在退出時不會做任何事情。

當使用陣列上的foreach,編譯器會擴展到其通過索引來訪問項目的環路(假設你直接數組實例工作),而不是上面枚舉的方法。

1

如果你想避免這種類型的循環:

foreach(var item in list) {}; 

...那麼你可以使用LINQ或Lambda表達式搜索,然後從列表中檢索。

例如:

using System.Linq; 

    // ... with Lambda 
    var ints = new List<int>(){1,2,3,4,5}; 
    var evenInts = ints.ForEach(i => i % 2 == 0); 

    // with straight Linq-to-objects: 
    var oddInts = from i in ints 
     where i % 2 == 1 
     select i; 
相關問題