質問

次の 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> クラス。

(本当に細かいことを言いたければ、 ForEach これは C# 言語の一部ではありません。これは .NET Base クラス ライブラリの一部です。)

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)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top