문자열(C#)을 "곱"할 수 있습니까?
예를 들어, 제가 끈을 가지고 있다고 가정하면,
string snip = "</li></ul>";
기본적으로 정수 값에 따라 여러 번 쓰고 싶습니다.
string snip = "</li></ul>";
int multiplier = 2;
// TODO: magic code to do this
// snip * multiplier = "</li></ul></li></ul>";
에디트: 나는 이것을 구현하기 위해 나만의 기능을 쉽게 작성할 수 있다는 것을 알고 있습니다. 나는 단지 내가 모르는 이상한 문자열 연산자가 있는지 궁금했습니다.
.NET 4에서는 다음을 수행할 수 있습니다.
String.Concat(Enumerable.Repeat("Hello", 4))
문자열이 단일 문자일 경우 문자열 생성자의 오버로드가 발생하여 문자열을 처리할 수 없습니다.
int multipler = 10;
string TenAs = new string ('A', multipler);
유감스럽게도 / 다행스럽게도 문자열 클래스는 sealled이므로 이 클래스에서 상속할 수 없으며 * 연산자를 오버로드할 수 없습니다.다음과 같은 방법으로 확장 메서드를 만들 수 있습니다.
public static string Multiply(this string source, int multiplier)
{
StringBuilder sb = new StringBuilder(multiplier * source.Length);
for (int i = 0; i < multiplier; i++)
{
sb.Append(source);
}
return sb.ToString();
}
string s = "</li></ul>".Multiply(10);
저는 Jokepu 박사님의 의견에 동의합니다. 하지만 어떤 이유로든 내장된 기능을 사용하여 부정행위를 하고 싶다면 다음과 같은 것을 할 수 있습니다.
string snip = "</li></ul>";
int multiplier = 2;
string result = string.Join(snip, new string[multiplier + 1]);
아니면, 만약 당신이 사용한다면.NET 4:
string result = string.Concat(Enumerable.Repeat(snip, multiplier));
개인적으로 저는 신경쓰지 않을 것입니다 - 맞춤형 확장 방법이 훨씬 더 좋습니다.
완전성을 위해 다른 방법이 있습니다.
public static string Repeat(this string s, int count)
{
var _s = new System.Text.StringBuilder().Insert(0, s, count).ToString();
return _s;
}
제가 얼마 전에 스택 오버플로에서 그것을 꺼낸 것 같아서 제 아이디어가 아닙니다.
방법을 작성해야 합니다. 물론 C# 3.0을 사용하면 확장 방법이 될 수 있습니다.
public static string Repeat(this string, int count) {
/* StringBuilder etc */ }
그러면:
string bar = "abc";
string foo = bar.Repeat(2);
만약 당신이 정말로 그것을 사용하고 싶다면, 조금 늦습니다.*
이 작업에 대한 연산자, 당신은 이것을 할 수 있습니다:
public class StringWrap
{
private string value;
public StringWrap(string v)
{
this.value = v;
}
public static string operator *(StringWrap s, int n)
{
return s.value.Multiply(n); // DrJokepu extension
}
}
그래서:
var newStr = new StringWrap("TO_REPEAT") * 5;
이러한 사용자에 대한 합리적인 동작을 찾을 수 있는 한, 다음을 통해 다른 연산자도 처리할 수 있습니다.StringWrap
클래스, like\
,^
,%
기타...
추신:
Multiply()
@Jokepu 박사의 모든 권한에 대한 연장 크레딧;-)
이것은 훨씬 더 간결합니다.
new StringBuilder().Insert(0, "</li></ul>", count).ToString()
네임스페이스using System.Text;
이 경우 를 가져와야 합니다.
string Multiply(string input, int times)
{
StringBuilder sb = new StringBuilder(input.length * times);
for (int i = 0; i < times; i++)
{
sb.Append(input);
}
return sb.ToString();
}
만약에.넷 3.5는 사용할 수 있지만 4.0은 사용할 수 없습니다.린크의
String.Concat(Enumerable.Range(0, 4).Select(_ => "Hello").ToArray())
다들 자기 것을 추가하고 있으니까요.NET4/Linq 예를 들어, 나는 내 것을 추가하는 것이 낫습니다. (기본적으로, Jokepu 박사의 것으로, 한 줄기로 축소됨)
public static string Multiply(this string source, int multiplier)
{
return Enumerable.Range(1,multiplier)
.Aggregate(new StringBuilder(multiplier*source.Length),
(sb, n)=>sb.Append(source))
.ToString();
}
좋아요, 그 문제에 대한 제 견해는 이렇습니다.
public static class ExtensionMethods {
public static string Multiply(this string text, int count)
{
return new string(Enumerable.Repeat(text, count)
.SelectMany(s => s.ToCharArray()).ToArray());
}
}
물론 제가 좀 바보 같지만, 코드 생성 수업에서 표가 필요할 때, 열거 가능합니다.반복은 저를 위해 해줍니다.네, String Builder 버전도 괜찮습니다.
다음은 나중에 참고할 수 있도록 이에 대한 제 견해입니다.
/// <summary>
/// Repeats a System.String instance by the number of times specified;
/// Each copy of thisString is separated by a separator
/// </summary>
/// <param name="thisString">
/// The current string to be repeated
/// </param>
/// <param name="separator">
/// Separator in between copies of thisString
/// </param>
/// <param name="repeatTimes">
/// The number of times thisString is repeated</param>
/// <returns>
/// A repeated copy of thisString by repeatTimes times
/// and separated by the separator
/// </returns>
public static string Repeat(this string thisString, string separator, int repeatTimes) {
return string.Join(separator, ParallelEnumerable.Repeat(thisString, repeatTimes));
}
언급URL : https://stackoverflow.com/questions/532892/can-i-multiply-a-string-in-c
'source' 카테고리의 다른 글
Spring @Value 주석에서 기본값을 올바르게 지정하는 방법은 무엇입니까? (0) | 2023.08.15 |
---|---|
jquery click on anchor 요소 힘을 맨 위로 스크롤하시겠습니까? (0) | 2023.08.15 |
PySpark에서 내림차순으로 정렬 (0) | 2023.08.15 |
GORM 시간 초과 시 MariaDB 세션을 제대로 종료할 수 없음 (0) | 2023.08.15 |
안드로이드에서 의도를 사용하여 전화를 거는 방법은 무엇입니까? (0) | 2023.08.15 |