簡體   English   中英

LINQ查詢表達式是否已優化?

[英]Are LINQ Query Expressions Optimized?

LINQ是否通過排序/轉換數據結構進行任何優化?

LINQ會在此代碼中進行迭代,還是對數據進行了某種類型的排序/轉換以優化查找操作?

var list = new List<IdCard> {new IdCard(){Name = "a", Number = 1}, new IdCard() { Name = "b", Number = 2 } };

var idA = list.FirstOrDefault(id => id.Name == "a");
var idB = list.FirstOrDefault(id => id.Name == "b");

我想了解我的LINQ代碼是否直接轉換為迭代方法。 如果是這樣,那么上面的代碼最好使用字典查找(如果有很多查找的話)而不是依賴LINQ,對嗎?

LINQ是否通過排序/轉換數據結構進行任何優化?

是。 貫穿各種LINQ方法的各種優化。

LINQ是否在此代碼中迭代

是。

是否對數據進行了任何類型的排序/轉換以優化查找操作?

否。以某種排序或散列的方式構造一個全新的數據結構所花費的工作將不僅僅是重復序列直到找到第一個項目為止 在LINQ實現中創建集合不僅會為每個項目處理更多的工作(因為您不僅要執行謂詞,還需要集合為將其存儲以供以后存儲所要做的任何工作),並且通過存儲使用更多的內存項需要更長的時間,但是一旦找到匹配項,您就無法立即退出,就像簡單迭代一樣。

那么上面的代碼最好使用字典查找(如果有很多查找的話)而不是依賴LINQ,對吧?

是的,如果您僅使用本機提供一種可以自然地提供最有效地執行要在該集合上執行的操作的類型的類型(在這種情況下,根據鍵優化搜索速度的集合),那么該代碼會更好。字典或排序字典),而不是使用不正確的集合類型和LINQ方法。

當查找具有任何集合(或者可以擁有,如果可以控制要使用的集合)的最佳算法與用於任意序列的算法相同時,使用LINQ很有用。 在很多情況下都是如此。 這不是其中一種情況。

謝謝您的回答! 他們非常有用。

看起來此查詢的答案確實是某些LINQ代碼可能已優化,並且檢查的最佳方法是簡單地查看源代碼。

如果我輸入錯了,請糾正我,但是該代碼似乎可以在這里找到:

https://github.com/Microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs

不,所有帶有謂詞參數的System.Linq擴展都會枚舉源集合,而不修改或優化源集合。 某些情況(例如OrderBy,GroupBy和Intersect)使用本地集合來防止多次枚舉源。

Lookup (類似於Dictionary<K, List<V>> )可以用作Dictionary替代方法

var list = new List<IdCard> {new IdCard(){Name = "a", Number = 1}, new IdCard() { Name = "b", Number = 2 } };
var lookup = list.ToLookup(c => c.Name);

var idA = lookup["a"].FirstOrDefault();
var idB = lookup["b"].FirstOrDefault();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM