2010-07-08 7 views
1

옙 ... 그것은 그 당시의 것 중 하나입니다.ForEach 루프의 문제점은 무엇입니까?

public string TagsInput { get; set; } 

//further down 
var tagList = TagsInput.Split(Resources.GlobalResources.TagSeparator.ToCharArray()).ToList(); 
tagList.ForEach(tag => tag.Trim()); //trim each list item for spaces 
tagList.ForEach(tag => tag.Replace(" ", "_")); //replace remaining inner word spacings with _ 

ForEach 루프는 모두 작동하지 않습니다. tagList는 단지 목록입니다.

감사합니다. 의 값을 변경하지 않는

public string TagsInput { get; set; } 

//further down 
var tagList = TagsInput.Split(Resources.GlobalResources.TagSeparator.ToCharArray()).ToList(); 
tagList.ForEach(tag => tag = tag.Trim()); //trim each list item for spaces 
tagList.ForEach(tag => tag = tag.Replace(" ", "_")); //replace remaining inner word spacings with _ 

트림 및 바꾸기 :

+3

"작동하지 않는다"고 말하지 마십시오. 일어날 것으로 예상되는 것과 실제로 관찰 한 것을 설명하십시오. – abelenky

답변

5

Trim()Replace()은 부름을하고있는 문자열을 수정하지 않습니다. 액션이 적용된 새 문자열을 만듭니다.

이 아니라 Select을 사용하려고합니다.

tagList = tagList.Select(t => t.Trim()).Select(t => t.Replace(" ", "_")).ToList(); 
+0

완벽! 광고 된대로 작동합니다! – unmircea

1

작동하지 않는 경우와, 당신은 실제로 아무것도하지 않는 것을 의미한다, 나는 당신이 당신의 코드를 약간 조정할 필요가 있다고 생각 문자열, 그들은 새로운 문자열 값을 반환합니다.

+0

예,하지만 여기에서는 로컬 루프 -var을 대체합니다. 나는 이것이 어떤 것도 해결할 것이라고 생각하지 않는다. 그러나 분석은 옳습니다. –

+0

참. 분석이 정확하다. 코드는 내 결과와 똑같은 결과를 만든다. – unmircea

2

ForEach (및 다른 "linq"메서드)는 목록 인스턴스를 수정하지 않습니다.

tagList = tagList.Select(tag => tag.Trim().Replace(" ", "_")).ToList(); 
+0

'ForEach'가 LINQ 메서드라고 생각하지 않습니다 ... List 메서드입니다. 그리고 ForEach는 호출 될 때 각 항목에 적용되는 동작이라고 생각합니다. – jrista

+0

@jrista - linq 메서드가 아닙니다. 그것이 따옴표 안에있는 이유입니다. –

+0

맞아요. 그러나 그 행동은 즉시 적용됩니다. 지연되지 않습니다. – jrista

2

이유는 문자열이 용납되지 않습니다. 따라서 각 Trim() 또는 Replac() 함수의 결과는 새 문자열을 생성합니다. 업데이트 된 값을 보려면 원래 요소에 다시 지정해야합니다.

+1

이것도 좋습니다 ... 작동하지 않는 이유를 제공하십시오. – unmircea

2

이것은 Microsoft가 ForEach를 IEnumerable에 구현 한 이유입니다. 이게 뭐가 잘못 됐어?

public string[] TagsInput { get; set; } 

//further down 
var adjustedTags = new List<string>(); 
foreach (var tag in TagsInput.Split(Resources.GlobalResources.TagSeparator.ToCharArray())) 
{ 
    adjustedTags.Add(tag.Trim().Replace(" ", "_")); 
} 

TagsInput = adjustedTags.ToArray(); 
+0

thankyou, 실제 감각이있는 누군가. 비록 당신이 목록의 비용이 필요하지 않더라도, 당신은 얼마나 많은 요소를 가지고 있는지 알 것입니다. –

+0

이것은 괜찮습니다. 나는 그것을 좋아한다. 고마워 – unmircea

관련 문제