.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は単に連鎖拡張方法の束です(しばしばIEnumerable<T>
)。IEnumerable<T>
の他の拡張方法と区別することにはめったにないポイントがあります。最良の区別は、それらがSystem.Linq
またはSystem.Something.Linq
名前空間のいずれかに存在することです。
それはlinqではありません。LINQの設計面の1つは、標準のLINQメソッドに副作用がないことです。foreachメソッドはこれに違反します。
Eric Lippertはこれについてのブログ記事を持っています:
http://ブログ.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
, を参照すると、それを呼び出すために当時必要だった古いデリゲート構文がわかります。
Visual Studio 2010年のLINQ拡張機能で提供される(IS)。