2015-05-01 52 views
4

我有一個5個項目的字符串數組。如何通過linq查詢來獲得這5個項目之一?爲什麼這個linq查詢返回一個布爾值而不是select的第一個結果?

下面的代碼只返回布爾值true。

string[] allWebTemplateSettings =SiteLidmaatschapSettings.Current.ProvisioningSettings; 
var webTemplate = allWebTemplateSettings 
      .Select(x => x.StartsWith(string.Format("Template:{0}", web.WebTemplate))) 
      .FirstOrDefault(); 
+0

您選擇StartsWith的返回值的類型是布爾 – MUG4N

回答

0

這是因爲StartsWith返回bool和你Selectbool根據是否具有該值或沒有開始說。所以實際上,你根本就不會過濾那個值,因爲你沒有使用過濾器表達式

其實,你只需要FirstOrDefault作爲列表已經是List<string>

string[] allWebTemplateSettings = SiteLidmaatschapSettings.Current.ProvisioningSettings; 
var webTemplate = allWebTemplateSettings 
    .FirstOrDefault(x => x.StartsWith(string.Format("Template:{0}", web.WebTemplate))); 
+0

這是沒有意義的。爲什麼你會選擇一個相同的項目? –

+0

從技術上講,他不需要*選擇' – xanatos

+0

是的,你是對的,他不需要'選擇',因爲它是一個字符串集合。 – mattytommo

3

嘛,你要與你選擇的bool的IEnumerable,那麼你選擇的第一個,如果有任何。這就是爲什麼你得到一個布爾作爲你的答案。

我想你真正想要的是這樣的:

string[] allWebTemplateSettings = SiteLidmaatschapSettings.Current.ProvisioningSettings; 
var prefix = string.Format("Template:{0}", web.WebTemplate); 
var webTemplate = allWebTemplateSettings 
    .FirstOrDefault(x => x.StartsWith(prefix)); 

我搬到字符串格式化了謂詞的操作,因爲它是一種浪費,重新計算它的每個元素在集合中(尤其是如果集合長)。

0

你混淆了Select,這選擇基於序列的每個現有值的新值,與Where,其過濾序列,因此只包含其中一個條件得到滿足項目

最簡單的變化是用Where替換Select的用法。

string[] allWebTemplateSettings = SiteLidmaatschapSettings.Current.ProvisioningSettings; 
var webTemplate = allWebTemplateSettings 
    .Where(x => x.StartsWith(string.Format("Template:{0}", web.WebTemplate))) 
    .FirstOrDefault(); 

其他的答案已經推出的Where這種用法爲FirstOrDefault沒有解釋你的潛在的混亂。

1

使用Where代替Select

var webTemplate = allWebTemplateSettings.Where(x => x.StartsWith(string.Format("Template:{0}", web.WebTemplate))).FirstOrDefault(); 
相關問題