Repeat в си шарп

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.

Читайте также:  Python variable arguments keyword

Источник

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. Вывод доказывает отсутствие каких-либо сюрпризов:

Вызов операции Range

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 + " ");

Вызов операции Repeat

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#

Article

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

Authors

Categories

Источник

Оцените статью