.ForEach()는 C# 언어의 어떤 부분인가요?
-
17-09-2020 - |
문제
다음 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는 본질적으로 부작용/필수적 작업입니다.
다른 팁
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 확장에 제공됩니다.