문제

다음 ForEach 기능을 누군가에게 설명할 때 #2가 "LINQ foreach 접근 방식" 아니면 단순히 "List<T> 확장 방법"는 공식적으로 LINQ와 관련이 없나요?

var youngCustomers = from c in customers
                     where c.Age < 30
                     select c;

//1. traditional foreach approach
foreach (var c in youngCustomers)
{
    Console.WriteLine(c.Display());
}

//2. LINQ foreach approach?
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display()));
도움이 되었습니까?

해결책

일반적인 방법이다 List<T> 사람들은 종종 다른 확장을 위해 자신만의 확장 방법을 제공하지만 IEnumerable<T>. LINQ는 ForEach 확장을 제공하지 않습니다. 기능적/불변 유형 작업이라는 설계 목표로 인해 ForEach는 본질적으로 부작용/필수적 작업입니다.

다른 팁

LINQ와 아무 관련이 없으며 확장 방법이 아닙니다.

ForEach List<T> 클래스.

(그리고 당신이 정말로 nitpicky가되기를 원했다면, ForEach는 전혀 C # 언어의 일부가 아닙니다. 그것은 .NET 기본 클래스 라이브러리의 일부입니다.)

List<T>의 확장 방법이 아니므로 List<T>의 일반적인 방법입니다.

LINQ와 아무 관련이 없습니다.그것이있는 경우 "LINQ와 공식적으로 연관된 공식적으로 연관된"사이의 구별은 실제로 매우 유용하지는 않습니다.LINQ는 단순히 연결된 확장 방법 (종종 GeneraCododicetagode)입니다.IEnumerable<T>에서 다른 확장 방법과 구별하는 데는 거의 없습니다.최상의 구별은 IEnumerable<T> 또는 System.Linq 네임 스페이스 중 하나에있는 것입니다.

LINQ가 아닙니다.LINQ의 디자인 측면 중 하나는 표준 LINQ 메서드가 부작용이 없음을 나타냅니다.foreach 방법은 이것을 위반할 것입니다.

에릭 리퍼트에는 블로그 기사가 있습니다.

http : // blogs.msdn.com / B / Ericlippert / Archive / 2009 / 05 / 18 / foreach-vs-foreach.aspx

youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display())); 

그것을 분석해 봅시다:

  • ToList 에 대한 호출입니다 System.Linq.Enumerable.ToList() .net Framework 3.5에 도입됨
  • ForEach 에 대한 호출입니다 System.Collections.Generic.List<T>.ForEach .net Framework 2.0에 도입됨
  • c => C# 3.0에 도입된 람다 식 구문입니다.

에 대한 문서를 보면 List<T>.ForEach, 를 사용하면 당시에 호출하는 데 필요했던 이전 대리자 구문을 볼 수 있습니다.

Side-effect foreach는 Visual Studio 2010의 LINQ 확장에 제공됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top