我想写一个linq查询,我想检查内部列表的每次迭代。如果没有linq,这基本上就是一个嵌套的for循环 - 就像这样:
List<Item> selectedList = new List<Item>();
foreach (Item i in item.Children)
{
var childPages = ((from innerItem in i.Children
where innerItem.Template.BaseTemplates.Contains(new TemplateItem(ContextDatabase.GetItem(templateID)), new Compare())
select innerItem).DefaultIfEmpty());
if (childPages.First() == null)
{
selectedList.AddRange(childPages.ToList());
}
}
我将内部循环转换为linq查询 - 现在我想将for循环转换为相同的 - 有没有办法在linq中编写它,以便我不必拥有foeach循环?
答案 0 :(得分:1)
我看不到你的课程,所以这是最好的猜测。另外,我假设您不必在LINQ语句中重复创建TemplateItem
和Compare
的新实例。
var templateItem = new TemplateItem(ContextDatabase.GetItem(templateID));
var comparer = new Compare();
selectedList.AddRange(item.Children.SelectMany(
x => x.Children.Where(y => y.Template.BaseTemplates.Contains(templateItem, comparer))));
(我在这里使用方法语法而不是查询语法,因为这是我更熟悉的。结果应该是相同的。)
答案 1 :(得分:1)
看起来你在每次迭代时从数据库中获取一个项目以进行比较......这是你绝对需要的吗?应该有一种更容易的方法来进行基于id的比较(但我想你需要更多的信息)。
无论如何,要删除外部foreach
,您可以执行另一个from
子句:
var childPages = (from i in item.Children
from innerItem in i.Children
where innerItem.Template.BaseTemplates.Contains(new TemplateItem(ContextDatabase.GetItem(templateID)), new Compare())
select innerItem).DefaultIfEmpty();
但同样,我会仔细研究ContextDatabase.GetItem(templateID)