我有一个包含5个项目的字符串数组。如何通过linq查询获得这5个项目中的一个?
下面的代码只返回一个布尔值true。
string[] allWebTemplateSettings =SiteLidmaatschapSettings.Current.ProvisioningSettings;
var webTemplate = allWebTemplateSettings
.Select(x => x.StartsWith(string.Format("Template:{0}", web.WebTemplate)))
.FirstOrDefault();
答案 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
而未解释您的潜在混淆。