- Enumerable. Repeat(TResult, Int32) Метод
- Параметры типа
- Параметры
- Возвращаемое значение
- Исключения
- Примеры
- Комментарии
- Enumerable. Repeat(TResult, Int32) Method
- Type Parameters
- Parameters
- Returns
- Exceptions
- Examples
- Remarks
- Операции Range, Repeat и Empty
- Range
- Repeat
- Empty
- How to Repeat a String in C#
- Using LINQ
- Using StringBuilder
- Using a for loop over an Array of characters
- Using a for loop over a Span of characters
- Benchmarks
- Authors
- Categories
Enumerable. Repeat(TResult, Int32) Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Генерирует последовательность, содержащую одно повторяющееся значение.
public: generic static System::Collections::Generic::IEnumerable ^ Repeat(TResult element, int count);
public static System.Collections.Generic.IEnumerable Repeat (TResult element, int count);
static member Repeat : 'Result * int -> seq
Public Function Repeat(Of TResult) (element As TResult, count As Integer) As IEnumerable(Of TResult)
Параметры типа
Тип значения, которое будет повторяться в результирующей последовательности.
Параметры
Требуемое число повторений данного значения в создаваемой последовательности.
Возвращаемое значение
Исключения
Значение параметра count меньше 0.
Примеры
В следующем примере кода показано, как использовать Repeat для создания последовательности повторяющегося значения.
IEnumerable strings = Enumerable.Repeat("I like programming.", 15); foreach (String str in strings) < Console.WriteLine(str); >/* This code produces the following output: I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. */
' Repeat the same string to create a sequence. Dim sentences As IEnumerable(Of String) = Enumerable.Repeat("I like programming.", 15) Dim output As New System.Text.StringBuilder For Each sentence As String In sentences output.AppendLine(sentence) Next ' Display the output. Console.WriteLine(output.ToString()) ' This code produces the following output: ' ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming.
Комментарии
Этот метод реализуется с помощью отложенного выполнения. Немедленное возвращаемое значение — это объект, в котором хранятся все сведения, необходимые для выполнения действия. Запрос, представленный этим методом, не выполняется, пока объект не будет перечислен либо путем вызова его GetEnumerator метода напрямую, либо с помощью foreach в C# или For Each в Visual Basic.
Enumerable. Repeat(TResult, Int32) Method
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Generates a sequence that contains one repeated value.
public: generic static System::Collections::Generic::IEnumerable ^ Repeat(TResult element, int count);
public static System.Collections.Generic.IEnumerable Repeat (TResult element, int count);
static member Repeat : 'Result * int -> seq
Public Function Repeat(Of TResult) (element As TResult, count As Integer) As IEnumerable(Of TResult)
Type Parameters
The type of the value to be repeated in the result sequence.
Parameters
The number of times to repeat the value in the generated sequence.
Returns
Exceptions
Examples
The following code example demonstrates how to use Repeat to generate a sequence of a repeated value.
IEnumerable strings = Enumerable.Repeat("I like programming.", 15); foreach (String str in strings) < Console.WriteLine(str); >/* This code produces the following output: I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. I like programming. */
' Repeat the same string to create a sequence. Dim sentences As IEnumerable(Of String) = Enumerable.Repeat("I like programming.", 15) Dim output As New System.Text.StringBuilder For Each sentence As String In sentences output.AppendLine(sentence) Next ' Display the output. Console.WriteLine(output.ToString()) ' This code produces the following output: ' ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming. ' I like programming.
Remarks
This method is implemented by using deferred execution. The immediate return value is an object that stores all the information that is required to perform the action. The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in C# or For Each in Visual Basic.
Операции Range, Repeat и Empty
Операции генерации помогают в генерации последовательностей.
Range
Операция Range генерирует последовательность целых чисел. У операции Range есть один прототип, описанный ниже:
public static IEnumerable Range( int start, int count);
Последовательность целых чисел генерируется, начиная со значения, переданного в start, протяженностью до count. Обратите внимание, что это не расширяющий метод, а одна из немногих стандартных операций запросов, которые не расширяют IEnumerable.
Если count меньше 0 или сумма start и count минус 1 больше int.MaxValue, генерируется исключение ArgumentOutOfRangeException. Давайте рассмотрим пример использования операции Range:
IEnumerable nums = Enumerable.Range(1, 100); foreach (int i in nums) Console.Write(i + " ");
Опять-таки, следует подчеркнуть, что операция Range не вызывается на последовательности. Это статический метод класса System.Linq.Enumerable. Вывод доказывает отсутствие каких-либо сюрпризов:
Repeat
Операция Repeat генерирует последовательность, повторяя указанный элемент заданное количество раз. У операции Repeat есть один прототип, описанный ниже:
public static IEnumerable Repeat( T element, int count);
Этот прототип возвращает объект, который при перечислении выдаст count экземпляров элемента Т. Обратите внимание, что он является не расширяющим методом, а одной из немногих стандартных операций запросов, которые не расширяют IEnumerable. Если значение аргумента count меньше нуля, генерируется исключение ArgumentOutOfRangeException.
Ниже показан пример, в котором генерируется последовательность из десяти элементов, каждый из которых является числом 2:
IEnumerable nums = Enumerable.Repeat(2, 10); foreach (int i in nums) Console.Write(i + " ");
Empty
Операция Empty генерирует пустую последовательность заданного типа. Операция Empty имеет один прототип, представленный ниже:
public static IEnumerable Empty();
Этот прототип возвращает объект, при перечислении выдающий последовательность из нуля элементов типа Т. Обратите внимание, что это не расширяющий метод, а одна из немногих стандартных операций запросов, которая не расширяет IEnumerable.
Ниже генерируется пустая последовательность типа string с использованием операции Empty и выводится значение Count для сгенерированной последовательности, которое должно быть равно нулю, поскольку последовательность пуста:
IEnumerable str = Enumerable.Empty(); foreach (string s in str) Console.Write(s); Console.WriteLine(str.Count());
Поскольку последовательность пуста, в цикле foreach отображать нечего, поэтому был предусмотрен вывод количества элементов в последовательности. Данный код выведет значение 0.
How to Repeat a String in C#
If you’re coming from another programming language like JavaScript, Rust or Go, you may be familiar with the repeat function found in the standard library of those languages. Unfortunately, C# doesn’t have this function — atleast as of .NET 6 — so we need to write our own. Here are some examples of how to repeat a string N times in C#.
Using LINQ
public static string RepeatLinq(this string text, uint n) return string.Concat(System.Linq.Enumerable.Repeat(text, (int)n)); >
Here we’re using the Enumerable.Repeat method from the System.Linq namespace to repeat the string n times. We then use the string.Concat method to concatenate the repeated strings together. This is a very simple way to repeat a string, but it’s not the most efficient way to do it.
Using StringBuilder
public static string RepeatStrBuilder(this string text, uint n) return new StringBuilder(text.Length * (int)n) .Insert(0, text, (int)n) .ToString(); >
For this one we instantiate a new StringBuilder object with the length of the string multiplied by the number of times we want to repeat it. Then we use the Insert method to insert the string n times into the StringBuilder , starting at the beginning of the string (index 0). Finally, we use the ToString method to return the string.
This method is generally more efficient than the previous one, is relatively simple and concise, but it’s still not the most efficient way to repeat a string.
Using a for loop over an Array of characters
public static string RepeatArray(this string text, uint n) var arr = new char[text.Length * (int)n]; for (var i = 0; i n; i++) text.CopyTo(0, arr, i * text.Length, text.Length); > return new string(arr); >
Ok, now things are getting interesting. We’re going to use a for loop to repeat the string n times. We’ll use a char[] array to store the repeated string. Then we’ll use the CopyTo method to copy the string into the array. This is a more complicated way of repeating a string, but it can be more effecient than the previous one, especially when n < 100 . But we can do even better.
Using a for loop over a Span of characters
public static string Repeat(this string text, uint n) var textAsSpan = text.AsSpan(); var span = new Spanchar>(new char[textAsSpan.Length * (int)n]); for (var i = 0; i n; i++) textAsSpan.CopyTo(span.Slice((int)i * textAsSpan.Length, textAsSpan.Length)); > return span.ToString(); >
Using a Span we are dropping down a level of abstraction and essentially dealing with contiguous memory on the stack instead of strings. This is why this method is the most efficient of all the ones we’ve seen previously. We’re copying memory slices of the original string into the a new Span . This turns out to be pretty efficient because it’s not allocating memory on the heap.
This is the method that we chose to use in the Ardalis.Extensions nuget package. You can see the source code on Github.
Here’s how easy it is to use the Repeat method. Go ahead and try it out!
Benchmarks
Here are the benchmark results of the different methods we’ve used to repeat a string.
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.22000 12th Gen Intel Core i9-12900K, 1 CPU, 24 logical and 16 physical cores .NET Core SDK=6.0.303 [Host] : .NET Core 6.0.8 (CoreCLR 6.0.822.36306, CoreFX 6.0.822.36306), X64 RyuJIT DefaultJob : .NET Core 6.0.8 (CoreCLR 6.0.822.36306, CoreFX 6.0.822.36306), X64 RyuJIT
Method | N | Mean | Error | StdDev | Ratio | RatioSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
---|---|---|---|---|---|---|---|---|---|---|
RepeatLinq | 1 | 15.575 ns | 0.1010 ns | 0.0844 ns | 1.00 | 0.00 | 0.0025 | — | — | 40 B |
RepeatStrBuilder | 1 | 17.407 ns | 0.3854 ns | 0.5885 ns | 1.11 | 0.04 | 0.0071 | — | — | 112 B |
RepeatArray | 1 | 9.459 ns | 0.2053 ns | 0.1920 ns | 0.61 | 0.01 | 0.0041 | — | — | 64 B |
RepeatSpan | 1 | 9.852 ns | 0.2188 ns | 0.3715 ns | 0.63 | 0.03 | 0.0041 | — | — | 64 B |
RepeatLinq | 10 | 71.550 ns | 0.9862 ns | 0.8742 ns | 1.00 | 0.00 | 0.0081 | — | — | 128 B |
RepeatStrBuilder | 10 | 52.637 ns | 1.1027 ns | 3.2515 ns | 0.75 | 0.03 | 0.0142 | — | — | 224 B |
RepeatArray | 10 | 40.338 ns | 0.7593 ns | 0.8744 ns | 0.56 | 0.01 | 0.0112 | — | — | 176 B |
RepeatSpan | 10 | 35.393 ns | 0.7495 ns | 0.7011 ns | 0.49 | 0.01 | 0.0112 | — | — | 176 B |
RepeatLinq | 100 | 554.149 ns | 4.2416 ns | 3.9676 ns | 1.00 | 0.00 | 0.0420 | — | — | 664 B |
RepeatStrBuilder | 100 | 274.108 ns | 5.3881 ns | 5.9889 ns | 0.49 | 0.01 | 0.0825 | — | — | 1296 B |
RepeatArray | 100 | 282.168 ns | 4.4919 ns | 4.2017 ns | 0.51 | 0.01 | 0.0792 | — | — | 1248 B |
RepeatSpan | 100 | 215.679 ns | 3.8950 ns | 3.6434 ns | 0.39 | 0.01 | 0.0794 | 0.0002 | — | 1248 B |
RepeatLinq | 1000 | 5,296.572 ns | 100.2936 ns | 93.8147 ns | 1.00 | 0.00 | 0.3815 | 0.0076 | — | 6064 B |
RepeatStrBuilder | 1000 | 2,477.808 ns | 49.4452 ns | 50.7766 ns | 0.47 | 0.01 | 0.7668 | 0.0267 | — | 12096 B |
RepeatArray | 1000 | 2,755.265 ns | 52.9493 ns | 72.4775 ns | 0.52 | 0.02 | 0.7668 | 0.0153 | — | 12048 B |
RepeatSpan | 1000 | 2,048.442 ns | 39.6767 ns | 55.6213 ns | 0.39 | 0.01 | 0.7668 | 0.0153 | — | 12048 B |