哪些方法可用於「關閉」已編譯的查詢。
返回序列的方法使用延遲執行,除非該方法類似於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