2012-04-24 1 views
44

나는 최근에 윈도우 8 메트로에서 도비를 시작했고, 내 옛 친구 중 한 명은 실종 된 것으로 보인다.목록이 <T>입니다 .ForEach() 메소드가 없어 졌습니까?

foreach() 구문을 사용하는 것보다 .ForEach() 메서드를 사용하는 경향이 있으며이 메서드를 사용할 수 없다는 것을 매우 빨리 깨달았습니다. 나는이 모든 토론을 찾을 수 있는지 확인하기 위해 검색 한

var list = new List<string>(); 

list.ForEach(System.Diagnostics.Debug.WriteLine); 

하지만 할 수 없습니다 예를 들어, 다음 코드는 지하철 응용 프로그램에서 컴파일되지 않습니다. 나는 단지 둔각인가 아니면 실제로 사라 졌는가?

+3

IEnumerable ForEach 확장 메서드 만 사용하지 마십시오. IList 있습니다. – Clueless

+0

당신은 정확합니다. 나는 조기에 일반적이었다. 나는 질문 제목을 바꿀 것이다. – Robaticus

+0

동일한 실수를했습니다. 제목에 IEnumerable이 있지만 예제에서는 분명히 목록에서 시도하고 있습니다. 편집 : 제목 업데이트 됨 :-) – yamen

답변

42

It's indeed gone:

목록 <T> .ForEach는 Metro 스타일 앱에서 제거되었습니다. 메서드가 단순 해 보이지만 ForEach로 전달 된 메서드에 의해 목록이 변경되면 여러 가지 잠재적 인 문제가 있습니다. 대신 foreach 루프를 사용하는 것이 좋습니다.


Wes Haggard | .NET Framework 팀 (BCL) | http://blogs.msdn.com/b/bclteam/

은 매우 이상하게 그러나, 그것은 documentation의 모습,있는 곳은이 방법은 윈도우 스토어의 앱 .NET에서 (메트로 스타일 앱에 대한 이전 .NET)을 지원하지 않는 것을 주장하지 않는다한다 . 아마 이것은 문서 작성 팀의 일원 일뿐입니다.

+1

@Robaticus : 대신 자신의 확장 방법을 추가하여 대체 할 수 있습니다. 아마도'.ToList()'를 먼저 호출 한 다음 그것을 반복하는 것이 가장 좋을 것입니다. 당신의 하루를 파멸시키기 위해 돌연변이를 시도하는 동안 소스를 반복하는 것 같은 것은 없습니다. – Will

+1

@ 윌 - 나는 그것을 할 수 있다고 동의합니다. 새로운 LINQ 프로그래머에게 일을하는 방법을 보여줄 때 특히 빠져 나가는 것이 좋은 습관 일 것입니다. – Robaticus

16

대안은 물론 스스로를 정의하는 것입니다 :

public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumeration, Action<T> action) 
{ 
    foreach(T item in enumeration) 
    { 
     action(item); 
     yield return item; 
    } 
} 

제공 : LINQ equivalent of foreach for IEnumerable<T>

(참고 : 중복)

+2

이것은 분명히 수용 가능하지만 이전 IEnumerable 호출 (예 : Where 또는 OrderBy)의 요구 사항을 수정하지 않도록주의하십시오. 또한 IEnumerable 호출을 계속 체인하려는 경우 항목에 대한 작업을 수행 한 후 반환 형식을 IEnumerable '및 'yield returns item'로 변경할 수 있습니다. 그러나 여전히 요소가 변경되므로 이러한 "부작용"으로 인해 열거 형이 변경 될 수 있습니다. – SPFiredrake

+0

예, ForEach는 확실히 위험합니다. 계속 체인을 허용하기 위해'IEnumerable '을 반환하는 대답을 업데이트했는데 이것은 일을 더 위험하게 만들 것 같습니다. – yamen

18

가 더 이상있을 이유에 대한 감각을 얻으려면 포함 된 Microsoft의 C# 팀에서 일하는 사람이이 게시물을 읽으십시오. http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

기본적으로 철학입니다. "LINQ"기능은 기능 프로그래밍 패러다임에서부터 높은 영감을 얻었으며 ForEach 확장 기능은 기능면에서 좋지 않습니다.

+0

Joel : 나는 조만간 일반화되어 IEnumerable 대신 목록 을 반영하도록 제목을 변경했습니다. – Robaticus

+8

"Microsoft의 C# 팀에서 일하는 사람"이 얼마나 미묘합니까 ... – BoltClock

+9

아, 그냥 Lippert입니다. 도대체 그가 아는 ​​것은 무엇입니까? ;) – Robaticus

관련 문제