List <int>를 쉼표로 구분 된 문자열로 변환


116

목록을 가져 와서 쉼표로 구분 된 문자열로 변환하는 방법이 있습니까?

나는 내가 그것을 반복하고 만들 수 있다는 것을 알고 있지만 어떻게 든 여러분 중 일부는 그것을하는 더 멋진 방법이라고 생각합니까?

나는 이러한 유형의 '트릭'을 정말로 배우고 싶으므로 사용하는 방법에 대해 설명하거나 문서에 링크하십시오.

답변:


189
List<int> list = ...;
string.Join(",", list.Select(n => n.ToString()).ToArray())

7
영리하지만 느리고 부풀어 서 요소 당 하나의 문자열을 할당합니다. StringBuilder를 사용하는 것이 훨씬 더 효율적입니다.
Steven Sudit

3
내가 온라인에서 본 것 (빠른 검색) String.Join은 StringBuilder를 사용하는 것보다 빠릅니다.
Yuriy Faktorovich 2010 년


6
Steven이 String.Join이 아닌 n.ToString () 부분을 참조하고 있다고 생각합니다.
Larsenal

9
Larsenal :하지만 StringBuilder.Append (Int32)는 어쨌든 정수에 대해 내부적으로 ToString을 호출합니다. StringBuilder는 각 요소에 문자열을 할당하는 비용을 마술처럼 피하지 않습니다. 그것은 단지 그것을 잘 보이지 않게합니다.
itowlson

115

간단한 해결책은

List<int> list = new List<int>() {1,2,3};
string.Join<int>(",", list)

방금 코드에서 사용하여 재미있게 작동했습니다.


1
감사! 이 아름다운 방법입니다
이르판 아쉬 라프

2
이것은 더 나은 접근 방식이며 허용되는 답변입니다. 이 접근 방식을 사용하면 Linq를 가져올 필요가 없으며 더 빠릅니다.
JoKeRxbLaCk

멋있는! 나는 string.Join에 일반적인 과부하가 있습니다. 감사.
mrmashal

10
List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(String.Join(",", list.Select(i => i.ToString()).ToArray()));

.NET 4를 사용할 수 없다면 좋습니다
Greg Woods

6

이 문제의 약간 더 복잡한 버전에 대한 약 한 무량의 솔루션 (대부분이 느리거나 버그가 있거나 컴파일도하지 않음)에 대해서는이 주제에 대한 내 기사의 주석을 참조하십시오.

http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx

및 StackOverflow 설명 :

Eric Lippert의 "콤마 퀴 블링"도전, 베스트 답변?


링크 주셔서 감사합니다. 이 문자열 연결 문제는 내가 예상했던 것보다 더 복잡하고 교육적인 것으로 밝혀졌습니다!
Steven Sudit

4

추가 멋짐을 위해 IEnumerable <T>의 확장 메서드로 만들어 모든 IEnumerable에서 작동합니다.

public static class IEnumerableExtensions {
  public static string BuildString<T>(this IEnumerable<T> self, string delim = ",") {
    return string.Join(delim, self)        
  }
}

다음과 같이 사용하십시오.

List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(list.BuildString(", "));

두 가지 가능한 최적화 : 1) 상관없이 각 항목 뒤에 구분 기호를 추가 한 다음 루프가 끝난 후 추가 구분 기호를 제거합니다. 2) StringBuilder의 용량을 지정하십시오.
Steven Sudit

1
Reflector를 파 내면 Join이 버퍼 크기를 미리 계산하기 위해 길이를 합산하고 루프 외부에 첫 번째 문자열을 추가 한 다음 루프 내부에 무조건 구분 기호를 추가하여 다음 문자열. 안전하지 않은 내부 속임수와 결합하면 매우 빠릅니다.
Steven Sudit

@Steven : 당신의 조언을 따랐습니다.
cdiggins

1
확장에서 구분 기호를 하드 코딩하고 구분 기호에 대해 전달 된 값을 무시하고 세미콜론을 놓쳤습니다. 그것은해야한다return string.Join(delim, self);
앤드류

1

상당히 빠른 것 같습니다.

IList<int> listItem = Enumerable.Range(0, 100000).ToList();
var result = listItem.Aggregate<int, StringBuilder, string>(new StringBuilder(), (strBuild, intVal) => { strBuild.Append(intVal); strBuild.Append(","); return strBuild; }, (strBuild) => strBuild.ToString(0, strBuild.Length - 1));

1

내 "영리한"항목 :

        List<int> list = new List<int> { 1, 2, 3 };
        StringBuilder sb = new StringBuilder();
        var y = list.Skip(1).Aggregate(sb.Append(x.ToString()),
                    (sb1, x) =>  sb1.AppendFormat(",{0}",x));

        // A lot of mess to remove initial comma
        Console.WriteLine(y.ToString().Substring(1,y.Length - 1));

조건부로 쉼표를 추가하는 방법을 찾지 못했습니다.


1
Select람다에 부작용으로 쓰지 마십시오 . 이 경우에도 사용하지 않는 y그래서 당신이 Select단지는 본질적으로 foreach그렇게 등을 쓰기 -.
Pavel Minaev

나는 이것을 좋은 해결책으로 제안하지 않았습니다. OP는 foreach보다 더 흥미로운 것을 원했습니다.
Larsenal

그래,하지만 학대 Select같은 것은 foreach"재미"를지나, 음, "학대"로 들어갑니다. 여기서 더 흥미로운 접근 방식은 Enumerable.Aggregatewith StringBuilder를 시드 값으로 사용 하는 것 입니다. 시도해보십시오.
Pavel Minaev

좋은 생각. 나는 밖으로 나가야하지만 그 소용돌이를 줄 수 있습니다.
Larsenal

0

System.Linq 라이브러리를 사용할 수 있습니다. 더 효율적입니다.

using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.