2009-07-14 4 views
9

다음과 같이 문자열 목록을 생성하는 LINQ 코드가 있습니다.문자열 목록을 단일 연결된 문자열로 변환하는 가장 빠른 방법은 무엇입니까?

var data = from a in someOtherList 
      orderby a 
      select FunctionThatReturnsString(a); 

어떻게 그 문자열 목록을 하나의 큰 연결 문자열로 변환합니까? 데이터에 다음 항목이 있다고 가정 해 보겠습니다.

"Some " 
"resulting " 
"data here." 

다음과 같은 문자열로 끝나야합니다.

"Some resulting data here." 

어떻게하면됩니까? 나는 이것에 대해 생각했다 :

StringBuilder sb = new StringBuilder(); 
data.ToList().ForEach(s => sb.Append(s)); 
string result = sb.ToString(); 

그러나 그것은 딱 맞는 것처럼 보이지 않는다. 그것이 올바른 해결책이라면 어떻게 확장 방법으로 바꾸는 것이 좋을까요?

답변

22

. 이 같은

+0

+1 이것은 가장 짧은 방법은 아니지만, OP가 명확하게 * 가장 빠름 *을 요구하고 있습니다.이 방법은'string.Concat' /'string.Join' 다음에 오는'ToArray()'를 사용하는 것보다 훨씬 빠릅니다. – Noldorin

+0

@ Noldorin : 가장 빠름은 약간 정의되지 않았습니다;) 프로그래머 또는 컴퓨터의 경우? –

+0

감사! 가장 빠른 방법은 실행 시간을 의미했습니다. – jasonh

16

String.Join을 사용해 보셨습니까? .ToList 호출의 오버 헤드를 기꺼이 감수하려면, 대신 .ToArray()를 사용하고 String.Join에 대한 호출과 결합하십시오.

var joined = String.Concat(someQuery.ToArray()); 

참고 : 내 솔루션은 배열에 약간의 오버 헤드가 포함되어 있기 때문에 속도가 가장 빠르지 않을 수 있습니다. 나의 의심은 마크의 길을 더 빨리가는 것이 더 빠를 것입니다. 하지만 대부분의 경우 코드에서 빠르고 간단하게 코드를 작성하는 방법을 찾고 있다면 내 경로가 작동합니다.

public static string Concat(this IEnumerable<string> source) { 
    StringBuilder sb = new StringBuilder(); 
    foreach(string s in source) { 
     sb.Append(s); 
    } 
    return sb.ToString(); 
} 

과 :

string s = data.Concat(); 

이 다음 여분의 ToList()/ToArray() 단계에 대한 필요가 없습니다에 대해 어떻게

+2

'string.Concat'을 사용하지 않는 특별한 이유는 무엇입니까? –

+0

@Mehrdad, nope, Join은 오늘 내 머리에 터진 첫 번째 가입자입니다. – JaredPar

+0

내 테스트에서 성능은 Marc의 솔루션 (다양한 문자열 및 컬렉션 길이의 경우)으로 목과 목으로 이루어 지므로 내 표를 얻습니다. – LukeH

3

사용 "집계"

List<string> strings = new List<string>() {"bob", "steve", "jane"}; 
    string result = strings.Aggregate((working, next) => working + next); 
    Console.WriteLine(result); 

참고 : 집계가 확장 방법과의 System.Linq 네임 스페이스에 있습니다.

+3

그 중간 문자열의 *** 많은 *** 수 ... –

0

JIT가 최적화하는 방법에 따라 string.Concat() 또는 StringBuilder를 사용하는 Marc의 메서드가 더 빠를 수 있습니다.

string.Concat(data.ToArray()); 

편집 : 데이터가있는 경우에만 경우 여기 Linq에를 사용하고 있기 때문에, 나는 성능이 내가 읽을 수있는 가장 쉬운 함께 가고 싶어하는 경우 절대 # 1의 요구 사항이 아니다 가정합니다 값 유형의 IEnumerable을, 당신은 IEnumerable을 < 객체 >에 캐스팅해야합니다 :

string.Concat(data.Cast<object>().ToArray()) 

편집 2 : 정말 Linq에 속도가 느린 것을 의미하지 않습니다. 나는 단지 두 측정 방법의 속도 차이가 측정 할 수있을지라도 극히 미미해야한다는 것을 의미합니다.

편집 3 : JIT는 String 클래스의 거의 모든 작업을 최적화하므로 String.Concat의 내부 런타임에 대한 단일 호출이 실제로 StringBuilder를 사용하는 것보다 빠를 수 있습니다. 나는 그것이 확실하지 않다, 그러나 당신은 확실히 그것을 시험해야한다.

+0

이후 Linq가 천천히 동등한되었습니다? –

+0

명확히하기 위해 편집 # 2를 추가했습니다. 죄송합니다. :) –

+0

왜'data.Select (x => x.ToString())'와 같은 것이 아니라'data.Cast ()'을할까요? – LukeH

1
data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString(); 
0

대안 :

>>> data = ['Some ', 'resulting ', 'data here.'] 
>>> s = ''.join(data) 
>>> s 
'Some resulting data here.' 
1

이 문을 사용할 수 있습니다. String.Join ("", someOtherList);

+0

좀 더 설명해 주시겠습니까? –

+0

아마도 가장 빠르지는 않지만 가장 간단합니다! – newman

관련 문제