[C#] LINQ를 사용하여 문자열 연결

구식을 쓰는 가장 효율적인 방법은 무엇입니까?

StringBuilder sb = new StringBuilder();
if (strings.Count > 0)
{
    foreach (string s in strings)
    {
        sb.Append(s + ", ");
    }
    sb.Remove(sb.Length - 2, 2);
}
return sb.ToString();

… LINQ에서?



답변

이 답변은 Aggregate질문에 요청 된 LINQ ( )의 사용법을 보여 주며 일상적인 사용을위한 것이 아닙니다. 이것이 사용하지 않기 때문에 StringBuilder매우 긴 시퀀스에서 끔찍한 성능을 발휘합니다. String.Join다른 답변에 표시된 것처럼 정기적 인 코드 사용

다음과 같은 집계 쿼리를 사용하십시오.

string[] words = { "one", "two", "three" };
var res = words.Aggregate(
   "", // start with empty string to handle empty list case.
   (current, next) => current + ", " + next);
Console.WriteLine(res);

출력 :

, 하나 둘 셋

집계는 값 모음을 가져와 스칼라 값을 반환하는 함수입니다. T-SQL의 예로는 min, max 및 sum이 있습니다. VB와 C # 모두 집계를 지원합니다. VB와 C #은 모두 확장 방법으로 집계를 지원합니다. 점 표기법을 사용하면 IEnumerable 객체 에서 메서드를 호출하기 만하면 됩니다.

집계 쿼리는 즉시 실행됩니다.

추가 정보 -MSDN : 집계 쿼리


CodeMonkeyKing의 의견에서 제안한 Aggregate사용 변형 을 실제로 사용 하려면 많은 객체에 대한 우수한 성능을 포함하여 일반과 거의 동일한 코드 가됩니다.StringBuilderString.Join

 var res = words.Aggregate(
     new StringBuilder(), 
     (current, next) => current.Append(current.Length == 0? "" : ", ").Append(next))
     .ToString();


답변

return string.Join(", ", strings.ToArray());

.Net 4에는 을 허용 하는 새로운 과부하 가 있습니다. 코드는 다음과 같습니다.string.JoinIEnumerable<string>

return string.Join(", ", strings);


답변

Linq를 왜 사용해야합니까?

string[] s = {"foo", "bar", "baz"};
Console.WriteLine(String.Join(", ", s));

그것은 완벽하게 작동 IEnumerable<string>하며 내가 기억 하는 한 받아들 입니다. Aggregate더 느린 여기에는 아무것도 필요하지 않습니다 .


답변

집계 확장 방법을 보셨습니까?

var sa = (new[] { "yabba", "dabba", "doo" }).Aggregate((a,b) => a + "," + b);


답변

내 코드의 실제 예 :

return selected.Select(query => query.Name).Aggregate((a, b) => a + ", " + b);

쿼리는 문자열 인 Name 속성을 가진 객체이며 선택한 목록의 모든 쿼리 이름을 쉼표로 구분하여 원합니다.


답변

다음은 다른 답변과 해결 된 문제를 살펴본 후 설정 한 결합 / 링크 방법입니다. 비슷한 질문에서 된 문제 (즉, 집계 및 연결이 0 요소로 실패 함)를 입니다.

string Result = String.Join(",", split.Select(s => s.Name));

또는 ( s 문자열이 아닌 )

string Result = String.Join(",", split.Select(s => s.ToString()));

  • 단순한
  • 읽고 이해하기 쉬운
  • 일반 요소에 적용
  • 객체 또는 객체 속성 사용 가능
  • 길이가 0 인 요소를 처리
  • 추가 Linq 필터링과 함께 사용 가능
  • 잘 수행 (적어도 내 경험에서)
  • StringBuilder구현하기 위해 추가 객체 (예 :)를 (수동으로) 만들 필요가 없습니다

물론 Join은 때때로 다른 접근법 ( for, foreach)에 몰래 들어가는 성가신 최종 쉼표 를 처리하므로 Linq 솔루션을 먼저 찾고있었습니다.


답변

당신이 사용할 수 StringBuilder있는 Aggregate:

  List<string> strings = new List<string>() { "one", "two", "three" };

  StringBuilder sb = strings
    .Select(s => s)
    .Aggregate(new StringBuilder(), (ag, n) => ag.Append(n).Append(", "));

  if (sb.Length > 0) { sb.Remove(sb.Length - 2, 2); }

  Console.WriteLine(sb.ToString());

(이것은 Select더 많은 LINQ 작업을 수행 할 수 있음을 보여주기 위해 있습니다.)