2010-12-08 4 views
2

У меня есть список целых чисел, состоящих изКак разбить петлю, если условие удовлетворяет в linq?

{1,2,3,1,2,1,5,1,2,1,1} 

Я хотел получить все 1 находится до 5. Мне нужно пропустить все остальные предметы после 5. Конечный список будет

{1,1,1} 

Как я могу это сделать с помощью linq?

ответ

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.

Как только мы это сделаем, мы можем просто отфильтровать результирующую последовательность до 1, используя Where.

+0

Большое спасибо – ratty 2010-12-08 06:56:50

2

Пример, показывающий различия в лености между решением Эндрю Харе и решением Саида.

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

Я не могу понять, почему вы предоставили это здесь и почему вы богатый аптайт, скопировав мой код. И я этого не сделал, это как отношение дружбы между двумя людьми. – 2010-12-09 10:36:50

Смежные вопросы