source

문자열(C#)을 "곱"할 수 있습니까?

lovecheck 2023. 8. 15. 11:13
반응형

문자열(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

반응형