2015-02-04 1 views
2

Как повторить целое IEnumerable несколько раз?C# повторение IEnumerable несколько раз

Подобно Python:

> print ['x', 'y'] * 3 
['x', 'y', 'x', 'y', 'x', 'y'] 
+1

Какой результат вы используете? –

+0

@ conanak99 Я добавил выход Python, теперь это должно быть хорошо. – m0nhawk

+0

Возможно, стоит добавить, что если бы это были ссылочные типы (в python), то это была бы копия ссылки и вместо значения – Sayse

ответ

12

Вы можете использовать простой LINQ, чтобы сделать это:

var repeated = Enumerable.Repeat(original, 3) 
         .SelectMany(x => x); 

Или вы могли бы просто написать метод расширения:

public static IEnumerable<T> Repeat<T>(this IEnumerable<T> source, 
             int count) 
{ 
    for (int i = 0; i < count; i++) 
    { 
     foreach (var item in source) 
     { 
      yield return count; 
     } 
    } 
} 

Обратите внимание, что в в обоих случаях последовательность была бы переоценена на каждом «повторе», чтобы она могла дать разные результаты, даже разной длины ... Действительно, некоторые последовательности не могут быть оценены более одного раза. Вы должны быть осторожны, что вы делаете это с, в основном:

  • Если вы знаете, что последовательность может быть оценена только один раз (или вы хотите, чтобы получить устойчивые результаты из противоречивой последовательности), но вы счастливы в буфер результаты оценки в памяти, вы можете позвонить ToList() первым и вызвать Repeat на этом
  • Если вы знаете, что последовательность может быть последовательно оценены несколько раз, просто позвоните Repeat как выше
  • Если вы ни в одном из перечисленных выше ситуаций, в принципе нет возможности повторять элементы последовательности несколько раз