哪些方法可用于“关闭”已编译的查询。
返回序列的方法使用延迟执行,除非该方法类似于ToXYZ
。 Where
,Select
,Take
,Skip
,GroupBy
和OrderBy
等等。返回查询的单个对象执行力,像First
,Single
,ToList
和ToArray
,ToDictionary
,ToLookup
,Any
,All
等方法更看到这个优秀的线程:Linq - What is the quickest way to find out deferred execution or not?
我知道大多数人请使用。 AsEnumerable()或.ToList(),但哪些其他方法也适用?我可以使用.AsQueryable(),还是这是一个无操作?
它们都是不同的。贾斯汀有一个盛大的解释。您可能还想看到:What's the difference(s) between .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
“.AsEnumerable()比.ToList()更快...并且苹果不是梨。 – spender 2010-07-16 08:51:58
是的,我知道你通常会选择你所需要的。不过,我认为了解性能差异很重要。 – Carvellis 2010-07-16 09:03:21