2012-04-24 1 views
4

이 LINQPad 관련 아니면 내가 뭔가 잘못하고있어 경우 나도 몰라,하지만이 코드는 내가 특별히 ForEach(...)이 작은 코드의 ForEach Replace는 예상 한대로 작동하지 않습니다. 여기서 내가 뭘 잘못하고 있니?

내 목표는 교체하는 것입니다, 그것은 수행 할 작업을하지 않는다 "" 빈 문자열; 이 작업을 수행하는 더 좋은 방법이 있습니까?

var lastNames = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN"; 

var listLastNames = lastNames.Split(','); 
var list = listLastNames.ToList(); //so I can use .ForEach 
list.ForEach(i=>i.Replace(" ",String.Empty)); 

list.Dump(); //show it on output 
+4

에서을 당신이 결과를 버리는 것에 덧붙여서, 나는 당신이 아마도'Replace'가 아닌'Trim'을 원한다는 것에 주목합니다. –

+0

'list.ForEach (i => i.Trim());'여기서는 효과가 없으므로'Replace'가 될지도 모르겠지만 ... 잘 작동하지 않았습니다 ... –

+2

'Trim()' 당신은 결과를 검색하지 않기 때문에 당신이 같은 문제가있을 것이라는 것을 제외하고는 충분할 것입니다. – PinnyM

답변

13

다른 사람들이 지적했듯이, 문자열 불변이다. 바꾸기를 호출하면 새 문자열이 반환됩니다. 기존의 문자열을 변경하지 않습니다.

에 순서를 변환을 수행하고, 마지막에 목록으로 변환 :

string s = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN"; 
List<string> lastNames = s.Split(',').Select(x=>x.Trim()).ToList(); 

또는 쿼리 구문에서 같은 일 : 여기 당신이 원하는 것을 할 수있는 세 가지 방법이 있습니다

string s = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN"; 
var query = from lastName in s.Split(',') 
      select lastName.Trim(); 
List<string> lastNames = query.ToList(); 

또는 배열을하고 자리에 배열 변이 :

string s = "SMITH, JOHNSON, WILLIAMS, JONES, BROWN"; 
string[] lastNames = s.Split(','); 
for (int i = 0; i < lastNames.Length; ++i) 
    lastNames[i] = lastNames[i].Trim(); 
+0

문자열 배열의 요소가 변경되지 않습니다 (내부 문자열이기 때문에)? 의미, lastNames [i]는 변경 불가능합니까? – Dhananjay

+3

@Dhananjay : 문자열을 변경할 수 없습니다. 배열은 정의에 따라 가변적 인 변수 모음입니다. 그것이 변수라고 불리는 이유입니다. –

+1

누군가가'[Pure]'함수의 반환 값을 무시하면 컴파일러 경고가 좋을 것이다. 이러한 경고에는 오 탐지 (false positives)가 많지 않으며 주석은 코드 계약 팀에 의해 이미 작성되었습니다. 코딩도 꽤 쉽습니다 (나는 오후에 roslyn을 배우는 동안 그것을 관리했습니다). 그리고이 실수가 꽤 흔하기 때문에, 그 이득도 거기에 있습니다. – CodesInChaos

10

Replace는 새 값을 반환하지만 당신이 그것을에 전화를 원래의 문자열에 영향을주지 않습니다. 당신이 필요로하는 일을하려면 Replace의 결과로 새 컬렉션을 구축해야 할 것이다 - 당신이 Select 쉽게이 작업을 수행 할 수 있습니다

var replaced = list.Select(i=>i.Replace(" ",String.Empty)); 

또 다른 장점은, 당신은에 List<T>에 캐스트 할 필요가 없습니다 이 작업을 수행.

그리고 다른 사람이 지적한 것처럼, 당신은 Replace()보다 청소기 솔루션으로 Trim()를 사용할 수 있습니다

var collection = lastNames.Split(',').Select(i => i.Trim()); 
+0

음,이 것은 그 일을했습니다! 그 덕분에! –