哪些方法可用于“关闭”已编译的查询。
返回序列的方法使用延迟执行,除非该方法类似于ToXYZ
. Where
, Select
, Take
, Skip
,GroupBy
等等OrderBy
都属于这个。返回单个对象的方法会强制执行查询,例如First
,和Single
, , ,等。有关更多信息,请参阅这个出色的线程:Linq - 找出延迟执行的最快方法是什么?ToList
ToArray
ToDictionary
ToLookup
Any
All
我知道大多数人使用 .AsEnumerable() 或 .ToList(),但还有哪些其他方法也有效?我可以使用 .AsQueryable(),还是这是一个无操作?
他们都是不同的。贾斯汀有一个宏大的解释。您可能还想看看:.ToList()、.AsEnumerable()、AsQueryable() 之间有什么区别?这有一个很好的答案。
一般来说,你可以通过查看方法本身的名称来理解方法的语义。一个名为的方法AsSomething
意味着它什么都不做,只是将输入作为 something返回。这可能涉及也可能不涉及返回一个新对象,但是以某种方式维护了一个引用。例如, aList<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