2009-11-11 61 views
1

我正在嘗試使用C#迭代器遍歷整數數組。下面的程序循環遍歷非泛型迭代器,但不通過泛型迭代器。我無法弄清楚這個問題。無法循環訪問通用迭代函數

namespace SampleCSApp 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 

     var output = new int[10]; 

     ParallelLoopResult LoopResult = 
     Parallel.For(1, 10, (int i, ParallelLoopState loop) => 
      { 
       if (i == 5) 
       { 
        loop.Break(); 
        return; 
       } 
       output[i] = Compute(i); 
      }); 

     long CompletedUpto = 10; 
     if (!LoopResult.IsCompleted && LoopResult.LowestBreakIteration.HasValue) 
      CompletedUpto = LoopResult.LowestBreakIteration.Value; 

     string format = string.Format(CompletedUpto == 10 ? "Ran to Completion" : "Completed upto:{0}",CompletedUpto); 
     Console.WriteLine(format); 

     int index = 0; 

     // This does not work. 
     foreach (var i in Iterate<int>(() => 0, i => i < output.Length, i => output[i], i => i++)) 
      Console.WriteLine("output[{0}]:{1}", index++, i); 

     // This works. 
     foreach(var i in Iterate(output)) 
      Console.WriteLine("output[{0}]:{1}", index++, i); 
    } 

    public static IEnumerable<T> Iterate<T>(Func<T> initialize, Func<T, bool> condition, Func<T, T> body, Func<T, T> update) 
    { 
     for (T i = initialize(); condition(i); i = update(i)) 
      yield return body(i);     
    } 

    public static IEnumerable<int> Iterate(int[] output) 
    { 
     for (int i = 0; i < output.Length; i++) 
      yield return output[i]; 
    } 

    private static int Compute(int i) 
    { 
     return i * i; 
    } 
} 
} 
+0

當你說它不起作用時,它會做什麼? – Spence 2009-11-11 04:04:42

回答

3

我覺得後增加是問題嗎?

如果你的函數返回i ++,它會不會返回我然後發佈增量的非共享變量?

即其更改爲

i => i + 1 

這是否幫助?

+0

謝謝。有效。 – Jagannath 2009-11-11 05:55:55