구식을 쓰는 가장 효율적인 방법은 무엇입니까?
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
사용 변형 을 실제로 사용 하려면 많은 객체에 대한 우수한 성능을 포함하여 일반과 거의 동일한 코드 가됩니다.StringBuilder
String.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.Join
IEnumerable<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 작업을 수행 할 수 있음을 보여주기 위해 있습니다.)
