繁体   English   中英

在字符串列表中选择一个字符串

[英]Select a string in a list of strings linq

在这里,我有一个site1中的字符串列表。 我需要检查site1和items1之间的公用项目,然后从items1中选择匹配的项目。 这是我的代码

 string query = "/sitecore/content/*";
 List<string> sites1 = Sitecore.Configuration.Settings.Sites.Select(x => x.StartItem.TrimStart('/')).ToList();
 List<Item> items1 = Sitecore.Context.Database.SelectItems(query).Where(x => x.DisplayName.Contains(sites1)).ToList();

有什么建议吗?

编辑:在这里我选择两个项目时出现错误

 var sites = Sitecore.Configuration.Settings.Sites.Select(f => new List<string>() { f.StartItem.TrimStart('/'), f.Language }).ToList();
 List<Item> items = Sitecore.Context.Database.SelectItems(query).Where(x => sites.Contains(x.DisplayName.ToLower())).ToList();

应该是相反的方式: site1.Contains(x.DisplayName) 此外,与列表相比, HashSet<string>对于多次查找更有效,这随着项目数量的增加而变得明显。

var sites1 = new HashSet<string>(Sitecore.Configuration.Settings.Sites
        .Select(x => x.StartItem.TrimStart('/')));

var items1 = Sitecore.Context.Database.SelectItems(query)
        .Where(x => site1.Contains(x.DisplayName))
        .ToList();

编辑:

我没有注意到SelectItems()返回IQueriable 在那种情况下,我将使用IEnamerable.Any<>扩展方法IEnamerable.Any<>第二条语句,该方法可以投影到服务器SQL查询中。

var items1 = Sitecore.Context.Database.SelectItems(query)
        .Where(x=>sites1.Any(it=>it == x.DisplayName))
        .ToList();

编辑2:从已编辑的问题更正查询:

var sites1 = Sitecore.Configuration.Settings.Sites
        .Select(x => new {DisplayName = x.StartItem.TrimStart('/'), Language = x.Language});

var siteNames = new HashSet<string>(sites1.Select(x=> x.DisplayName.ToLower());

var items1 = Sitecore.Context.Database.SelectItems(query)
        .Where(x=>siteNames.Any(it=>it == x.DisplayName.ToLower()))
        .ToList();
List<Item> items1 = Sitecore.Context.Database.SelectItems(query).Where(x => sites1.Contains(x.DisplayName)).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM