为什么这个linq查询返回一个布尔值而不是select的第一个结果?

时间:2015-05-01 08:29:44

标签: c# linq

我有一个包含5个项目的字符串数组。如何通过linq查询获得这5个项目中的一个?

下面的代码只返回一个布尔值true。

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

3 个答案:

答案 0 :(得分:4)

嗯,你用你的Select获得了IEnumerable bool,然后你选择了第一个,如果有的话。这就是为什么你得到一个布尔作为答案的原因。

我认为你真正想要的是:

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

我已将字符串格式化操作移出谓词,因为为集合中的每个元素重新计算它是浪费的(特别是如果集合很长)。

答案 1 :(得分:0)

这是因为require会返回StartsWith,而bool表示Select bool基于它是否以该值开头。实际上,你甚至根本没有对该值进行过滤,因为你没有使用过滤表达式

实际上,您只需要FirstOrDefault,因为列表已经是List<string>

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

答案 2 :(得分:0)

您会混淆Select,其中根据序列的每个现有值选择一个新值,Where会过滤一个序列,因此它只包含项< em>其中满足条件。

最简单的更改是将Select的使用替换为Where

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

其他答案已将Where的这种用法转换为FirstOrDefault而未解释您的潜在混淆。