2012-07-17 43 views
-5

什麼是GetEnumerator()linq中的用法。如何使用GetEnumerator()

任何人都可以向我解釋它是如何與一個基本的例子。

在此先感謝。

+0

在問這個問題之前,你甚至嘗試過閱讀一些文檔嗎? – 2012-07-18 20:27:56

回答

8

GetEnumerator()返回可用於遍歷集合的對象。

比方說,你有一個數字的下面的列表:

var numbers = new List<Int32>() {1, 2, 3, 4, 5}; 

,並希望所有甚至轉換爲字符串的數字,您可以編寫以下方法:

IEnumerable<string> GetEvenStrings(IEnumerable<Int32> source) 
{ 
    using (var enumerator = source.GetEnumerator()) 
     while (enumerator.MoveNext()) 
      if (enumerator.Current % 2 == 0) 
       yield return enumerator.Current.ToString(); 
} 

MoveNext方法將有EnumeratorCurrent屬性指向集合中的下一個元素,如果沒有元素(否則爲true),將返回false

這是如何使用枚舉器的一個非常基本的例子。更復雜和實際的用途是例如此implementationZip方法:

private static IEnumerable<TResult> ZipImpl<TFirst, TSecond, TResult>( 
    IEnumerable<TFirst> first, 
    IEnumerable<TSecond> second, 
    Func<TFirst, TSecond, TResult> resultSelector) 
{ 
    using (IEnumerator<TFirst> iterator1 = first.GetEnumerator()) 
    using (IEnumerator<TSecond> iterator2 = second.GetEnumerator()) 
    { 
     while (iterator1.MoveNext() && iterator2.MoveNext()) 
     { 
      yield return resultSelector(iterator1.Current, iterator2.Current); 
     } 
    } 
} 

(此代碼是從喬恩斯基特的Edulinq project,我強烈建議)

在這個例子中,Enumerator用於同時遍歷兩個集合,導致一個單一的集合。


一般情況下,你可能想,如果你想遍歷集合一步一步的應用一些邏輯來使用Enumerator,你不想先消耗整個集合,因爲集合可能正在使用deffered execution

相關問題