2010-12-08 10 views

Répondre

15

Essayez ceci:

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); 
    } 
} 

Le procédé TakeWhile donne tous les éléments de la séquence d'origine jusqu'à un élément ne satisfait pas au prédicat. Donc, dans ce cas, nous donnons tous les nombres de list jusqu'à ce que nous atteignons celui qui est égal à 5.

Une fois que nous avons fait cela, nous pouvons simplement filtrer la séquence résultante à seulement 1 en utilisant Where.

+0

Merci beaucoup – ratty

2

Exemple montrant les différences de paresse entre la solution d'Andrew Hare et la solution de 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

Je ne peux pas comprendre pourquoi vous avez fourni ceci ici et pourquoi vous riche upvote en copiant mon code. Et je ne l'ai pas fait, c'est comme une relation d'amitié entre deux personnes ici. –