X번 반복되는 문자열을 쉽게 반환할 수 있는 방법이 있습니까?
아이템 깊이를 기준으로 문자열 앞에 일정 수의 들여쓰기를 삽입하려고 하는데, 문자열을 X번 반복해서 반환하는 방법이 있는지 궁금합니다.예:
string indent = "---";
Console.WriteLine(indent.Repeat(0)); //would print nothing.
Console.WriteLine(indent.Repeat(1)); //would print "---".
Console.WriteLine(indent.Repeat(2)); //would print "------".
Console.WriteLine(indent.Repeat(3)); //would print "---------".
동일한 문자만 반복하려는 경우 문자와 반복 횟수를 허용하는 문자열 생성자를 사용할 수 있습니다.new String(char c, int count)
.
예를 들어 대시를 5회 반복하는 방법:
string result = new String('-', 5);
Output: -----
.NET 4.0을 사용하는 경우 와 함께 사용할 수 있습니다.
int N = 5; // or whatever
Console.WriteLine(string.Concat(Enumerable.Repeat(indent, N)));
그렇지 않다면 아담의 대답과 같은 것으로 갈 것입니다.
내가 일반적으로 안드레이의 대답을 사용하는 것을 조언하지 않는 이유는 단순히ToArray()
은 화는불통오초래다니합를드로 합니다.StringBuilder
.0이가 되지 않는다면 가 되지 즉, 최소한 .NET 4.0이 필요하지 않고 작동하며 빠르고 쉽습니다(효율성이 크게 문제가 되지 않는다면 문제가 되지 않습니다).
스트링에 대한 가장 성능이 뛰어난 솔루션
string result = new StringBuilder().Insert(0, "---", 5).ToString();
public static class StringExtensions
{
public static string Repeat(this string input, int count)
{
if (string.IsNullOrEmpty(input) || count <= 1)
return input;
var builder = new StringBuilder(input.Length * count);
for(var i = 0; i < count; i++) builder.Append(input);
return builder.ToString();
}
}
대부분의 시나리오에서 가장 깔끔한 솔루션은 다음과 같습니다.
public static class StringExtensions
{
public static string Repeat(this string s, int n)
=> new StringBuilder(s.Length * n).Insert(0, s, n).ToString();
}
사용법은 다음과 같습니다.
text = "Hello World! ".Repeat(5);
이는 다른 답변(특히 @c0rd)을 기반으로 합니다.단순성뿐만 아니라 다음과 같은 기능이 있습니다. 여기서 설명한 다른 모든 기술이 공유하는 것은 아닙니다.
- OP가 요청한 대로 문자가 아닌 임의의 길이의 문자열을 반복합니다.
- 의 효율적인
StringBuilder
스토리지 사전 할당을 통해.
문자열을 사용합니다.원하는 문자열에 단일 문자만 포함된 경우 PadLeft.
public static string Indent(int count, char pad)
{
return String.Empty.PadLeft(count, pad);
}
여기에 지불해야 하는 신용
문자열 및 문자 [버전 1]
string.Join("", Enumerable.Repeat("text" , 2 ));
//result: texttext
문자열 및 문자 [버전 2]:
String.Concat(Enumerable.Repeat("text", 2));
//result: texttext
문자열 및 문자 [버전 3]
new StringBuilder().Insert(0, "text", 2).ToString();
//result: texttext
문자만:
new string('5', 3);
//result: 555
연장 방법:
(더 빠르게 작동 - WEB에 더 적합)
public static class RepeatExtensions
{
public static string Repeat(this string str, int times)
{
var a = new StringBuilder();
//Append is faster than Insert
( () => a.Append(str) ).RepeatAction(times) ;
return a.ToString();
}
public static void RepeatAction(this Action action, int count)
{
for (int i = 0; i < count; i++)
{
action();
}
}
}
용도:
var a = "Hello".Repeat(3);
//result: HelloHelloHello
문자열(단일 문자가 아닌 경우)을 반복하고 다음과 같이 결과를 반복할 수 있습니다.
String.Concat(Enumerable.Repeat("---", 5))
Dan Tao의 답변을 듣고 싶지만 .NET 4.0을 사용하지 않는 경우 다음과 같은 작업을 수행할 수 있습니다.
public static string Repeat(this string str, int count)
{
return Enumerable.Repeat(str, count)
.Aggregate(
new StringBuilder(str.Length * count),
(sb, s) => sb.Append(s))
.ToString();
}
string indent = "---";
string n = string.Concat(Enumerable.Repeat(indent, 1).ToArray());
string n = string.Concat(Enumerable.Repeat(indent, 2).ToArray());
string n = string.Concat(Enumerable.Repeat(indent, 3).ToArray());
모든 프로젝트에서 사용 중인 확장 방법 추가:
public static string Repeat(this string text, int count)
{
if (!String.IsNullOrEmpty(text))
{
return String.Concat(Enumerable.Repeat(text, count));
}
return "";
}
누군가 그것을 사용할 수 있기를 바랍니다.
저는 주어진 답이 마음에 듭니다.하지만 제가 과거에 사용했던 것과 같은 맥락입니다.
"".PadLeft(3*Indent,'-')
이렇게 하면 들여쓰기를 만들 수 있지만 기술적으로 문제는 문자열을 반복하는 것이었습니다.문자열 들여쓰기가 >-<와 같은 경우에는 허용된 답변뿐만 아니라 이도 작동하지 않습니다.이 경우 StringBuilder를 사용하는 c0rd의 솔루션은 좋아 보이지만 StringBuilder의 오버헤드로 인해 성능이 가장 우수하지 않을 수 있습니다.한 가지 옵션은 문자열 배열을 작성하고 들여쓰기 문자열로 채운 다음 이를 반복하는 것입니다.화이트:
int Indent = 2;
string[] sarray = new string[6]; //assuming max of 6 levels of indent, 0 based
for (int iter = 0; iter < 6; iter++)
{
//using c0rd's stringbuilder concept, insert ABC as the indent characters to demonstrate any string can be used
sarray[iter] = new StringBuilder().Insert(0, "ABC", iter).ToString();
}
Console.WriteLine(sarray[Indent] +"blah"); //now pretend to output some indented line
우리는 모두 영리한 해결책을 좋아하지만 때로는 간단한 것이 최선입니다.
놀랍게도 아무도 구식 학교에 가지 않았습니다.나는 이 코드에 대해 어떠한 주장도 하지 않고 단지 재미로 하는 것입니다.
public static string Repeat(this string @this, int count)
{
var dest = new char[@this.Length * count];
for (int i = 0; i < dest.Length; i += 1)
{
dest[i] = @this[i % @this.Length];
}
return new string(dest);
}
일반적으로 StringBuilder 클래스와 관련된 솔루션은 다중 문자열 반복에 가장 적합합니다.단순한 연결이 불가능하고 손으로 더 효율적으로 수행하기 어렵거나 불가능한 방식으로 대량의 문자열 조합을 처리하도록 최적화되어 있습니다.여기에 표시된 StringBuilder 솔루션은 O(N) 반복을 사용하여 반복 횟수에 비례하는 균일한 속도로 완료합니다.
그러나 반복 횟수가 매우 많거나 효율성이 높아야 하는 경우에는 StringBuilder의 기본 기능과 유사한 작업을 수행하되 아래와 같이 원래 문자열이 아닌 대상에서 추가 복사본을 생성하는 것이 좋습니다.
public static string Repeat_CharArray_LogN(this string str, int times)
{
int limit = (int)Math.Log(times, 2);
char[] buffer = new char[str.Length * times];
int width = str.Length;
Array.Copy(str.ToCharArray(), buffer, width);
for (int index = 0; index < limit; index++)
{
Array.Copy(buffer, 0, buffer, width, width);
width *= 2;
}
Array.Copy(buffer, 0, buffer, width, str.Length * times - width);
return new string(buffer);
}
이렇게 하면 각 반복마다 소스/대상 문자열의 길이가 두 배가 되므로 원래 문자열을 통과할 때마다 카운터를 재설정하는 오버헤드를 줄일 수 있습니다. 대신 훨씬 더 긴 문자열을 원활하게 읽고 복사할 수 있습니다. 이는 현대 프로세서가 훨씬 더 효율적으로 수행할 수 있는 기능입니다.
2진법 로그를 사용하여 문자열의 길이를 두 배로 늘려야 하는 횟수를 확인한 다음 여러 번 계속합니다.복사할 나머지 길이가 복사할 총 길이보다 작으므로 이미 생성한 부분 집합을 복사하기만 하면 됩니다.
배열을 사용했습니다.StringBuilder 사용에 대한 Copy() 메서드는 StringBuilder의 내용을 자체로 복사하면 각 반복에서 해당 내용으로 새 문자열을 생성하는 오버헤드가 발생합니다.Array.Copy()는 효율성이 매우 높은 상태에서 작동하면서 이러한 문제를 방지합니다.
이 솔루션은 반복 횟수에 따라 로그적으로 증가하는 비율인 O(1 + 로그 N) 반복을 완료하는 데 필요하며(반복 횟수를 두 배로 증가시키는 것은 추가 반복 횟수와 같습니다), 비례적으로 증가하는 다른 방법에 비해 상당히 절약됩니다.
또 다른 접근 방식은 다음과 같습니다.string
~하듯이IEnumerable<char>
집합의 항목에 지정된 인자를 곱하는 일반 확장 방법을 사용합니다.
public static IEnumerable<T> Repeat<T>(this IEnumerable<T> source, int times)
{
source = source.ToArray();
return Enumerable.Range(0, times).SelectMany(_ => source);
}
그래서 당신의 경우:
string indent = "---";
var f = string.Concat(indent.Repeat(0)); //.NET 4 required
//or
var g = new string(indent.Repeat(5).ToArray());
이것이 어떻게 작동할지는 확실하지 않지만, 쉬운 코드 조각입니다.(아마도 저는 그것을 실제보다 더 복잡하게 보이게 했을 것입니다.)
int indentCount = 3;
string indent = "---";
string stringToBeIndented = "Blah";
// Need dummy char NOT in stringToBeIndented - vertical tab, anyone?
char dummy = '\v';
stringToBeIndented.PadLeft(stringToBeIndented.Length + indentCount, dummy).Replace(dummy.ToString(), indent);
또는 예상할 수 있는 최대 수준 수를 알고 있는 경우 어레이를 선언하고 인덱스를 지정할 수 있습니다.이 배열을 정적 또는 상수로 만들 수 있습니다.
string[] indents = new string[4] { "", indent, indent.Replace("-", "--"), indent.Replace("-", "---"), indent.Replace("-", "----") };
output = indents[indentCount] + stringToBeIndented;
아담의 대답에 대해 언급할 충분한 담당자가 없지만, 이를 위한 가장 좋은 방법은 다음과 같습니다.
public static string RepeatString(string content, int numTimes) {
if(!string.IsNullOrEmpty(content) && numTimes > 0) {
StringBuilder builder = new StringBuilder(content.Length * numTimes);
for(int i = 0; i < numTimes; i++) builder.Append(content);
return builder.ToString();
}
return string.Empty;
}
numTimes가 0보다 큰지 확인해야 합니다. 그렇지 않으면 예외가 발생합니다.
한 줄을 반복해서 인쇄합니다.
Console.Write(new string('=', 30) + "\n");
==============================
새로운 기능을 사용하여 올바른 크기를 미리 할당하고 다음을 사용하여 루프에서 단일 문자열을 복사할 수 있습니다.Span<char>
.
저는 추가 할당이 전혀 없기 때문에 이것이 가장 빠른 방법일 것이라고 의심합니다: 문자열은 정확하게 할당됩니다.
public static string Repeat(this string source, int times)
{
return string.Create(source.Length * times, source, RepeatFromString);
}
private static void RepeatFromString(Span<char> result, string source)
{
ReadOnlySpan<char> sourceSpan = source.AsSpan();
for (var i = 0; i < result.Length; i += sourceSpan.Length)
sourceSpan.CopyTo(result.Slice(i, sourceSpan.Length));
}
저는 이 해결책을 보지 못했습니다.현재 소프트웨어 개발 분야에서는 더 단순합니다.
public static void PrintFigure(int shapeSize)
{
string figure = "\\/";
for (int loopTwo = 1; loopTwo <= shapeSize - 1; loopTwo++)
{
Console.Write($"{figure}");
}
}
이를 위해 확장 메서드를 만들 수 있습니다!
public static class StringExtension
{
public static string Repeat(this string str, int count)
{
string ret = "";
for (var x = 0; x < count; x++)
{
ret += str;
}
return ret;
}
}
또는 @Dan Tao 솔루션 사용:
public static class StringExtension
{
public static string Repeat(this string str, int count)
{
if (count == 0)
return "";
return string.Concat(Enumerable.Repeat(indent, N))
}
}
언급URL : https://stackoverflow.com/questions/3754582/is-there-an-easy-way-to-return-a-string-repeated-x-number-of-times
'programing' 카테고리의 다른 글
선택 변경 시 데이터 속성 값 가져오기 (0) | 2023.05.23 |
---|---|
u는 정확히 무엇을 합니까?"git push -u origin master" vs "git push origin master" (0) | 2023.05.23 |
Excel VBA 성능 - 100만 행 - 값이 포함된 행을 1분 이내에 삭제 (0) | 2023.05.23 |
DOM 요소를 jQuery 요소로 변환하려면 어떻게 해야 합니까? (0) | 2023.05.23 |
로컬 Gitrepo에 파일을 나열하시겠습니까? (0) | 2023.05.23 |