programing

IE 문자열에 숫자를 지정할 수 있습니다.

easyjava 2023. 9. 11. 22:25
반응형

IE 문자열에 숫자를 지정할 수 있습니다.

이 사실을 처음 접했지만 지금은 알게 되었고 이 사실을 쉽게 변환할 수 있는 방법을 찾을 수 없다는 사실에 놀랐습니다.IEnumerable<char>에 이르기까지string.

내가 생각하는 가장 좋은 방법은string str = new string(myEnumerable.ToArray());, 하지만, 제가 보기에, 이것은 새로운 것을 창조할 것 같습니다.char[], 그리고 나서 새로운 것을 만듭니다.string비싼 것 같네요

저는 이것이 에 내장된 공통 기능이라고 생각했을 것입니다.NET 프레임워크 어딘가에 있습니다.이것을 하는 더 간단한 방법이 있습니까?

관심있는 분들은 문자열을 필터링하기 위해 LINQ를 사용합니다.

string allowedString = new string(inputString.Where(c => allowedChars.Contains(c)).ToArray());

사용하시면 됩니다.

var allowedString = String.Concat(
    inputString.Where(c => allowedChars.Contains(c))
);

주의 사항: 이 접근 방식은 성능에 영향을 미칩니다.String.Concat특수한 대소문자 집합이 아니기 때문에 모든 문자가 문자열로 변환된 후 문서언급된 대로 연결된 것처럼 수행됩니다.물론 이를 통해 이 작업을 수행할 수 있는 기본적인 방법이 제공되지만, 더 나은 작업을 수행할 수 있습니다.

프레임 내에서 특별한 경우를 제공할 구현은 없다고 생각합니다.char실행해야 합니다.문자열 작성기에 문자를 추가하는 간단한 루프는 작성하기에 충분히 간단합니다.


여기 제가 개발 기계에서 찍은 몇 가지 벤치마크가 있는데, 그것은 옳아 보입니다.

32비트 릴리스 빌드에서 300자 시퀀스로 1000000회 반복:

대상 배열 문자열: 00:00:03.1695463콘캣 : 00:00:07:2518054StringBuilderChars : 00:00:03.1335455StringBuilder 문자열: 00:00:06.4618266
static readonly IEnumerable<char> seq = Enumerable.Repeat('a', 300);

static string ToArrayString(IEnumerable<char> charSequence)
{
    return new String(charSequence.ToArray());
}

static string Concat(IEnumerable<char> charSequence)
{
    return String.Concat(charSequence);
}

static string StringBuilderChars(IEnumerable<char> charSequence)
{
    var sb = new StringBuilder();
    foreach (var c in charSequence)
    {
        sb.Append(c);
    }
    return sb.ToString();
}

static string StringBuilderStrings(IEnumerable<char> charSequence)
{
    var sb = new StringBuilder();
    foreach (var c in charSequence)
    {
        sb.Append(c.ToString());
    }
    return sb.ToString();
}

의 릴리스를 위해 편집되었습니다.넷코어 2.1

의 릴리스에 대한 테스트를 반복합니다.Net Core 2.1, 결과는 다음과 같습니다.

"Concat"을 1000000회 반복하는데 842ms가 걸렸습니다.

"new String"을 1000000회 반복하는데 1009ms가 걸렸습니다.

1000000번의 "message"를 반복하는 데 902ms가 걸렸습니다.

간단히 말해서, 만약 당신이 사용하고 있다면요.넷코어 2.1 이상,Concat왕입니다.

자세한 내용은 MS 블로그 게시글 참조


저는 이 문제를 다른 질문의 주제로 삼았지만 점점 더 이 질문에 대한 직접적인 대답이 되고 있습니다.

3가지 간단한 변환 방법에 대한 성능 테스트를 해봤습니다.IEnumerable<char>에 이르기까지string 방법들은, 은

새끈

return new string(charSequence.ToArray());

콘캣

return string.Concat(charSequence)

스트링빌더

var sb = new StringBuilder();
foreach (var c in charSequence)
{
    sb.Append(c);
}

return sb.ToString();

제 테스트에서, 그것은 연결된 질문에 자세히 나와 있습니다.1000000복의 "Some reasonably small test data"는 이런.면,

"Concat"을 1000000회 반복하는데 1597ms가 걸렸습니다.

1000000번의 "새 문자열"을 반복하는 데 869ms가 걸렸습니다.

"StringBuilder"를 10000회 반복하는데 748ms가 걸렸습니다.

이것은 나에게 사용할 좋은 이유가 없다는 것을 암시합니다.string.Concat이 일에 있어서는단순화를 원하는 경우 새 문자열 접근 방식을 사용하고 성능을 원하는 경우 StringBuilder를 사용합니다.

저는 제 주장에 대해 주의를 기울일 것입니다. 실제로 이 모든 방법은 잘 작동하며, 이 모든 것이 최적화를 초과할 수 있습니다.

.NET 4부터는 IE numberable을 인수로 사용하는 문자열 메서드가 많습니다.

string.Concat(myEnumerable);

또 다른 가능성은 다음과 같습니다.

string.Join("", myEnumerable);

저는 성과를 측정하지 않았습니다.

다음은 StringBuilder의 보다 간결한 답변 버전입니다.

return charSequence.Aggregate(new StringBuilder(), (seed, c) => seed.Append(c)).ToString();

Jeff Mercado가 사용한 것과 동일한 테스트를 사용하여 시간을 조정했는데, 이 테스트는 동일한 300자 시퀀스(32비트 릴리스 빌드)에서 1,000,000회 반복에 걸쳐 1초 느렸습니다.

static string StringBuilderChars(IEnumerable<char> charSequence)
{
    var sb = new StringBuilder();
    foreach (var c in charSequence)
    {
        sb.Append(c);
    }
    return sb.ToString();
}

그래서 만약 여러분이 축전지의 팬이라면, 여기 있습니다.

제 데이터는 조드렐이 올린 결과와 상반됩니다.먼저 제가 사용하는 확장 방법을 살펴보겠습니다.

public static string AsStringConcat(this IEnumerable<char> characters)
{        
    return String.Concat(characters);
}

public static string AsStringNew(this IEnumerable<char> characters)
{
    return new String(characters.ToArray());
}

public static string AsStringSb(this IEnumerable<char> characters)
{
    StringBuilder sb = new StringBuilder();
    foreach (char c in characters)
    {
        sb.Append(c);
    }
    return sb.ToString();
}

나의결과

와 함께

  • STRLEN = 31
  • ITERATION = 10000

인풋

  • ((IEnumerable<char>)RandomString(STRLEN)).Reverse()

결과.

  • 콘캣 : 1x
  • 신제품 : 3배
  • StringBuilder: 3x

인풋

  • ((IEnumerable<char>)RandomString(STRLEN)).Take((int)ITERATIONS/2)

결과.

  • 콘캣 : 1x
  • 신제품 : 7배
  • StringBuilder: 7x

인풋

  • ((IEnumerable<char>)RandomString(STRLEN)) (이것은 그저 업캐스트일 뿐입니다)

결과.

  • 콘캣 : 0ms
  • 신제품 : 2000ms
  • StringBuilder: 2000ms
  • 다운캐스트 : 0ms

인텔 i5760 과녁을 겨누고 실행했습니다.NET Framework 3.5.

언급URL : https://stackoverflow.com/questions/11654190/ienumerablechar-to-string

반응형