2009-06-07 3 views
8
내가 문자열의 목록으로 채워집니다 다음 일반 목록이

:foreach를 사용하여 일반 목록에서 항목을 수정하는 방법은 무엇입니까?

List<string> mylist =new List<string>(); 
myList.add("string1"); 
myList.add("string2"); 

내가 각 문자열의 끝에서 '시험'을 추가 할 말을, 나는 간단한 방법으로 어떻게 할 수 있습니까? 직관적으로, 나는 이것을 컴파일 해 보았습니다. ok :

myList.ForEach(s => s = s + "test"); 

그러나 목록의 내용을 보면 아무 것도 변경되지 않았습니다. 나는 for 루프를 사용하여리스트를 반복 할 수 있다고 생각하지만, 아주 단순한 것을 찾고 ForEach를 사용하는 것은 잘 보이지만 작동하지 않는다. 어떤 아이디어?

답변

14

문제 것은 Action 당신의 요소에서 실행됩니다 지정된 것입니다 목록하지만 결과는 어디에도 돌아 가지 않습니다 ... s은 로컬 변수입니다.

현재 위치에서 아마 실제 foreach 걸릴 것 목록을 변경,하지만 당신은 결과로 새로운 목록을 드리겠습니다, 당신은 시도 할 수 :

list = list.ConvertAll(s => s + "test"); 

완전히 동일하지 ...하지만 최대한 가까이 ...

+1

대안으로 IEnumerable .Select (s => s + "test") ... –

9

목록 유형이 가변 참조 유형 (그리고이 경우 목록에서 실제 참조를 변경할 수는 있지만 개체 자체는 변경할 수 없다면)을 수행 할 수 없습니다. (이 ref 아니다)

delegate void Action<T>(T obj); 

여기, 인수가 에 의해 전달 :

이유는 는 서명과 Action<T> 대리자를 호출하는 것입니다. 이 코드는 본질적으로 동일하다

을 : 어떤 방법과 마찬가지로, 당신은이 값에 의해라고 입력 인수를 변경할 수 없습니다

void anonymous_method(string s) { 
    s = s + "test"; // no way to change the original `s` inside this method. 
} 

list.ForEach(anonymous_method); 
+0

설명해 주셔서 감사합니다. 굉장히 유용하다. – Anthony

+1

나는 또한 설명을 위해 ye '을 고맙다. .. 그것은 내가 본 가장 단순한 straigth-up 설명이다. MSDN의 모든것과 모든 것을 무너 뜨린다. 고마워. – corlettk

+0

예, 답이 훨씬 깔끔하고 직관적입니다. – Vincent

관련 문제