문제

확인,

우리는 많은 것을 가지고 있습니다 어디 코드의 조항. 우리는 안에 상태. 나는 다음과 같이 깨끗한 방법을 생각해 내려고 노력하고있다.

public static string Join<T>(this IEnumerable<T> items, string separator)
{
    var strings = from item in items select item.ToString();
    return string.Join(separator, strings.ToArray());
}

다음과 같이 사용할 수 있습니다.

var values = new []{1, 2, 3, 4, 5, 6};
values.StringJoin(",");
// result should be:
// "1,2,3,4,5,6"

따라서 이것은 매우 기본적인 작업을 수행하는 멋진 확장 방법입니다. 간단한 코드가 항상 빠르거나 효율적인 실행으로 바뀌지는 않지만이 간단한 코드로 놓칠 수있는 것에 대해 궁금합니다. 우리 팀의 다른 구성원들은 다음과 같이 주장하고 있습니다.

  • 충분히 유연하지 않습니다 (문자열 표현의 제어 없음)
  • 메모리 효율적이지 않을 수 있습니다
  • 빠르지 않을 수 있습니다

어느 전문가 차임에?

문안 인사,

에릭.

도움이 되었습니까?

해결책

첫 번째 문제와 관련하여 각 항목의 변환을 문자열로 제어하기 위해 다른 'Formatter'매개 변수를 추가 할 수 있습니다.

public static string Join<T>(this IEnumerable<T> items, string separator)
{
    return items.Join(separator, i => i.ToString());
}

public static string Join<T>(this IEnumerable<T> items, string separator, Func<T, string> formatter)
{
    return String.Join(separator, items.Select(i => formatter(i)).ToArray());
}

두 번째 두 가지 문제와 관련하여 나중에 성능 문제를 해결하고 문제가되지 않는 한 걱정하지 않을 것입니다. 그러나 병목 현상이 많지는 않지만 ...

다른 팁

어떤 이유로, 나는 그렇게 생각했다 String.Join a StringBuilder 수업. 그러나 그렇지 않다면, 다음은 큰 입력에 대해 더 나은 성능을 발휘할 수 있습니다. String 반복의 각 결합에 대한 개체.

public static string Join<T>(this IEnumerable<T> items, string separator)
{
    // TODO: check for null arguments.
    StringBuilder builder = new StringBuilder();
    foreach(T t in items)
    {
        builder.Append(t.ToString()).Append(separator);
    }

    builder.Length -= separator.Length;
    return builder.ToString();
}

편집하다: 여기 있습니다 분석 사용하는 것이 적절한 경우 StringBuilder 그리고 String.Join.

StringBuilder를 사용하고 컬렉션을 직접 반복하여 추가하십시오. 그렇지 않으면 문자열 배열 (var 문자열)을 만들고 결합을 수행합니다.

시퀀스 및 시퀀스 항목에 대한 NULL 검사가 누락되었습니다. 그리고 그렇습니다. 가장 빠르고 가장 메모리 효율적인 방법은 아닙니다. 아마도 시퀀스를 열거하고 항목의 문자열 표현을 StringBuilder. 그러나 이것이 정말로 중요합니까? 성능 문제가 있습니까? 최적화해야합니까?

이것은 또한 작동합니다 :

public static string Test(IEnumerable<T> items, string separator)
{
    var builder = new StringBuilder();
    bool appendSeperator = false;
    if(null != items)
    {
        foreach(var item in items)
        {
            if(appendSeperator)
            {
                builder.Append(separator)
            }

            builder.Append(item.ToString());

            appendSeperator = true;
        }
   }

   return builder.ToString();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top