2010-08-20 3 views
12

나는 다음과 같은목록의 모든 요소를 ​​트리밍하려면 어떻게해야합니까?

string tl = " aaa, bbb, ccc, dddd    eeeee"; 

var tags = new List<string>(); 
tags.AddRange(tl.Split(',')); 
tags.ForEach(x => x = x.Trim().TrimStart().TrimEnd()); 

var result = String.Join(",", tags.ToArray()); 

노력하고있어하지만, 태그는 항상 다시 "AAA"로 "BBB"를 오는 작동하지 않습니다.

목록의 모든 요소를 ​​트리밍하려면 어떻게해야합니까?

답변

24
// you can omit the final ToArray call if you're using .NET 4 
var result = string.Join(",", tl.Split(',').Select(s => s.Trim()).ToArray()); 

중간 컬렉션이 아닌 최종 결과 문자열 만 필요한 경우 일반 표현식을 사용하여 문자열을 정리할 수 있습니다. 당신은 정규식 분할 트림 조인 기술을 능가할지 여부를 결정하기 위해 벤치 마크해야합니다 :

var result = Regex.Replace(tl, @"(?<=^|,) +| +(?=,|$)", ""); 
+0

이것은 그가 원하는 방식으로 작동하지 않습니다. 문제는 dddd와 eeeee 사이에 쉼표가 없다는 것입니다. –

+5

@Justin : OP가 어디에서 문제가 있다고 말합니까? 내가 아는 한 목록에는 "aaa"*, * "bbb"*, * "ccc"* 및 * "dddd eeeee"*라는 네 가지 요소가 있어야합니다. – LukeH

+0

나는 좀 상상했다. 그리고 네 말이 맞아. 나는 너무 많이 읽고 가정을했다. –

1

귀하의 문제는 DDDD와 eeeee 사이에 쉼표가 없다는 것입니다. 이들을 분리하려면, ' '으로 분할하고 쉼표를 제거한 다음 여분의 공백을 제거해야합니다.

string tl = " aaa, bbb, ccc, dddd    eeeee"; 

var result = t1.Split(' ').Where(s => !String.IsNullOrEmpty()) 
          .Select(s => s.Replace(',','').Trim()) 
          .ToArray(); 
+0

공백으로 나눈 후에는 빈 요소를 모두 필터링해야합니다. tl.Split ('') .Select (s => s.Replace (",", ""). Trim()). =>! string.IsNullOrEmpty (s)). ToArray() – theburningmonk

5

작동하지 않는 접근법은 x가 (대리인 즉 로컬)을 ForEach 호출 처리되는 현재 기준 문자열의 복사본이 있다는 이유. 따라서 할당은 목록에 참조 된 항목에 영향을 미치지 않습니다.

4

무슨 일이 벌어 지는지는 foreach 문을 사용하여 모음을 수정하려는 것입니다. 이것은 아니오입니다. 컬렉션은 foreach으로 수정할 수 없습니다.

루프를 수정하거나 lambdas를 사용하여 LukeH의 솔루션을 사용할 수 있습니다.

관련 문제