コンパイルされたクエリを「閉じる」ために使用できるメソッド。
シーケンスを返すメソッドは、メソッドが。のようなものでない限り、遅延実行を使用しますToXYZ
。Where
、、、、Select
などがこれTake
に該当します。単一のオブジェクトを返すメソッドは、、、、、、、、、などのクエリの実行を強制します。詳細については、この優れたスレッドを参照してください。Linq-遅延実行を見つける最も簡単な方法は何ですか。Skip
GroupBy
OrderBy
First
Single
ToList
ToArray
ToDictionary
ToLookup
Any
All
ほとんどの人が.AsEnumerable()または.ToList()のいずれかを使用していることは知っていますが、他のどのメソッドも同様に機能しますか?.AsQueryable()を使用できますか、それともこれはノーオペレーションですか?
それらはすべて異なります。ジャスティンは壮大な説明をしています。.ToList ()、. AsEnumerable()、AsQueryable()の違いは何ですか?良い答えがあります。
一般に、メソッド自体の名前を確認することで、メソッドのセマンティクスを理解できます。名前の付いたメソッドAsSomething
は、入力を何かとして返す以外に何もしないことを意味します。これには、新しいオブジェクトを返すことが含まれる場合と含まれない場合がありますが、参照は何らかの形で維持されます。たとえば、List<T>.AsEnumerable()
単にキャストを行うだけIEnumerable<T>
です(もちろん、linqコンテキストではより大きな意味があります)。List<T>
どこにでも変更を反映して、キャストバックして変更することができます。それをテストするには:
var list = new List<int> { 1, 2 };
var enum = list.AsEnumerable();
var newlist = enum as List<string>;
newlist.Add(3);
//print enum.Count() -> 3
のように見えるメソッドToSomething
ですが、まったく新しいオブジェクトが別のオブジェクトに変換されることがよくあります。
var list = new List<int> { 1, 2 };
var newlist = list.ToList();
newlist.Add(3);
//print list.Count -> 2
linqのコンテキスト外の何かを考えてみましょう。object.ToString()
結果として新しい文字列表現が作成されます(文字列はとにかく不変なので、少し意味がありません)。興味深いセマンティクスはList<T>.AsReadonly
、新しいインスタンスを返すセマンティクスですがReadOnlyCollection<T>
、その外部のリストを変更すると、の内部リストも変更されるReadOnlyCollection<T>
ため、という名前が付けられAsReadonly
ます。
var list = new List<int> { 1, 2 };
var readonlylist = list.AsReadonly();
list.Add(3);
//print readonlylist.Count -> 3