2013-02-15 2 views
11

왜이 ForEach가 작동하지 않는지 궁금하고 후행 공백이있는 값을 남겨 둡니다.ForEach는 문자열 배열의 문자열 값을 자릅니다.

string days = "Monday, Tuesday, Wednesday, Thursday, Friday"; 

string[] m_days = days.Split(','); 

m_days.ToList().ForEach(d => { d = d.Trim(); }); 

나는 그래서 내가 필요하지 않은 거기에 답이 일을 다른 방법이 알고있다.

답변

19

당신이 트리밍 된 문자열을 다시 할당되지 않기 때문에.

var list = m_days.Split(',').Select(s => s.Trim()).ToList(); 
내가 잘못 ForEach을 사용하고있는 경우 ForEach가 작동하지 않거나 왜

?

ForEach은 Linq가 아니므로 List<T>입니다. 당신이하는 일은 기본적으로 다음과 같습니다 :

foreach(string day in m_days) 
{ 
    day.Trim(); // you are throwing away the new string 
} 
+0

예 ForEach가 작동하지 않는 이유 또는 ForEach를 잘못 사용하고 있는지 알고 싶습니다. Select 문을 사용할 수 있다는 것을 알고 있습니다 ... – David

+0

@David :이 작업에 ForEach를 사용할 수없는 이유에 대한 내 대답을 참조하십시오. –

+1

@David :'ForEach'는 Linq가 아니며'List '의 메소드입니다. 내 대답을 편집했습니다. –

4

당신은과 같이, 새로운 변수로를 ForEach의 출력을 지정해야합니다 원래 문자열을 수정하지 않는

var trimmedResult = m_days.Select(d => d.Trim()).ToList(); 
3

String.Trim() 때문입니다. ForEach(d => d.Trim())에 전화 할 때 목록의 각 항목에 대해 메모리에 새 다듬기 문자열을 만들지 만 해당 문자열은 아무 곳에 나 할당되지 않습니다. 당신이 무엇을하고 있는지 그게 전부 : 당신이 필요로하는 무엇

foreach(string d in list) 
{ 
    d.Trim(); 
} 

m_days = days.Split(',').Select(d => d.Trim()).ToArray(); 
+1

와우. 누군가는 String.Trim이 원래의 문자열을 수정한다고 생각하니? –

3

string.Trim이 새 문자열 인스턴스를 반환합니다. 그래서 어떻게 든해야합니다 새 인스턴스를 사용하십시오.
코드에서 그렇게하지 않습니다.
또한 ForEach으로는 가능하지 않습니다.

m_days.ToList().ForEach(d => { d = d.Trim(); }); 

을하지만 d 참조에 의해 전달되지 않기 때문에 당신은 단지 대리자로 전달 된 로컬 매개 변수를 변경되도록 즉, 어느 도움이 될 수 없습니다 : 언뜻보기에, 다음이 일할 수있는 목록에 저장된 인스턴스가 아닙니다.

당신이 가장 가능성이 원하는 :

var result = days.Split(',').Select(x => x.Trim()).ToList(); 

LINQ없이 또 다른 방법은 다음과 같을 것이다 :

var split = days.Split(','); 
for(int i = 0; i < split.Length; ++i) 
    split[i] = split[i].Trim(); 
+0

이 게시물에 나를 이길 수 있지만 이것이 최고의 솔루션입니다. – JMan

+0

좋아, 더 이상의 대안을 게시 할 필요가 없습니다. 나는 대안을 안다. 나는 ForEach의 사용을 오해 한 것 같아. 왜 Foreach가 작동하지 않는지 정확히 알고 싶습니다. – David

+0

@David : 첫 번째 코드 단편 이후 부분에서 설명했습니다. –

관련 문제