[英]What is the difference between these 2 LINQ queries?
我有2個LINQ查詢,一個返回我期望的,另一個沒有,我試圖理解為什么。 我試圖找出是否從Config中的所有節點,是否有一個名為“TEST”的節點,其Selected屬性為True。
查詢1 - 返回正確的東西的條件是Any():
var res1 =
(from config in _config.CurrentSettings.Config let name = config.name select config).Any(
config => config.name.Equals("TEST") && config.selected == true);
失敗的查詢2具有Select中的條件:
(_config.CurrentSettings.Config.Select(config => config.name.Equals("TEST") && config.selected))
.Any();
LINQ的Any()
沒有條件意味着“至少有一行”。 第一個查詢指定一個條件,使其“至少有一行符合條件”。
要使第二個查詢等效於第一個查詢,請使用Any(flag => flag)
,或將Select
替換為Where
。 這兩個選項都不如初始的Any
,條件在里面,因為它們不具有可讀性。
這整件事都沒用。
(from config in _config.CurrentSettings.Config let name = config.name select config)
你可以縮小到這個范圍
_config.CurrentSettings.Config.Any(config => config.name.Equals("TEST") && config.selected == true);
哪個與第一個代碼塊相同。
Select
方法使用您提供的選擇器將不可數據轉換為另一個表單。 無參數的Any
如果序列中包含的任何元素返回true。 否則返回false。
你可能想嘗試:
var isTestSelected = _config.CurrentSettings.Config.Any(config => config.name.Equals("TEST") && config.selected);
如果查看每個鏈接的“參數”部分,您會看到雖然兩個方法都接受Func
,但它們的用法實際上是不同的。
任何
predicate類型:
System.Func<TSource, Boolean>
用於測試條件的每個元素的函數。
選擇
selector類型:
System.Func<TSource, TResult>
要應用於每個元素的轉換函數。
因此,在Query1示例中,您將一個轉換(或映射)應用於集合中的每個項目,它聲明一個本地名稱變量let name = config.name
(未使用),然后只返回該對象原樣(沒有實際轉換任何東西) select config
。 這段代碼是多余的,可以刪除。
你的Any()
lambda通過過濾與lambda謂詞不匹配的項來完成Query1中的所有工作。
在Query2中,您將過濾lambda傳遞給變換函數,然后使用不帶過濾器的過濾函數。
使用Linq有許多不同的方法可以獲得所需的結果。 我鼓勵您查看框架( 鏈接 )提供的不同映射(選擇器)和過濾(謂詞)函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.