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

Ola*_*Ola 6 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();
Run Code Online (Sandbox Code Playgroud)

Asa*_*din 5

好吧,你得到了一个IEnumerable布尔值Select,然后你选择第一个(如果有的话)。这就是为什么你得到 abool作为你的答案。

我认为你真正想要的是:

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

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


Ham*_*m3d 5

使用Where代替Select

var webTemplate = allWebTemplateSettings.Where(x => x.StartsWith(string.Format("Template:{0}", web.WebTemplate))).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)


mat*_*mmo 0

那是因为StartsWith返回 abool并且您所说的Select基于bool它是否以该值开头。所以实际上,您甚至根本没有过滤该值,因为您没有使用过滤表达式

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

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