2010-12-08 150 views

回答

15

嘗試這種情況:

using System.Linq; 

class Program 
{ 
    static void Main() 
    { 
     var list 
      = new[] { 1, 2, 3, 1, 2, 1, 5, 1, 2, 1, 1 }; 

     var filteredList 
      = list.TakeWhile(i => i != 5) 
        .Where(j => j == 1); 
    } 
} 

TakeWhile方法產生從原始序列的所有元素,直到一個元件出現故障的謂詞。所以在這種情況下,我們得到list中的所有數字,直到達到等於5的數字爲止。

一旦我們完成了這一步,我們可以使用Where簡單地將結果序列過濾到1。

+0

非常感謝你 – ratty 2010-12-08 06:56:50

2

示例顯示了Andrew Hare的解決方案和Saeed的解決方案之間的差異。

class Program 
{ 
    public static IEnumerable<int> TestData() 
    { 
     while (true) 
      yield return 5; 
    } 

    public static IEnumerable<int> AndrewHare(IEnumerable<int> xs) 
    { 
     return xs.TakeWhile(i => i != 5) 
       .Where(j => j == 1); 
    } 

    public static IEnumerable<int> Saeed(IEnumerable<int> xs) 
    { 
     bool find5 = false; 
     return xs.Where(p => p == 1 && !(find5 = (p == 5) ? true : find5)); 
    } 

    static void Main(string[] args) 
    { 
     Stopwatch watch = new Stopwatch(); 

     watch.Restart(); 
     for (int i = 0; i < 1000000; i++) 
     { 
      foreach (var x in AndrewHare(TestData())) ; 
     } 
     watch.Stop(); 
     Console.WriteLine(watch.ElapsedMilliseconds); 

     watch.Restart(); 
     for (int i = 0; i < 1000000; i++) 
     { 
      foreach (var x in Saeed(TestData())) ; 
     } 
     watch.Stop(); 
     Console.WriteLine(watch.ElapsedMilliseconds); 

     Console.ReadKey(); 
    } 
} 
+0

我不明白你爲什麼在這裏提供這個,爲什麼你通過粘貼我的代碼複製upvote。我沒有,這就像兩個人在這裏的友誼關係。 – 2010-12-09 10:36:50

相關問題