如何在Linq查询中使用Yield
|
我有以下方法:
public string GetDepartmentTitle(string DepartmentAbbreviation) {
List<TaxonomyItem> Divisions = TaxonomyFromCMS.GetAllItems(DomainDataConstants.DivisionAndDepartment.TAXONOMY_ID);
List<TaxonomyItem> Departments = new List<TaxonomyItem>();
Divisions.ForEach(delegate(TaxonomyItem Division) {
Departments.AddRange(Division.SubTaxonomyItems);
});
TaxonomyItem Result = (from d in Departments
where d.Name == DepartmentAbbreviation
select d).FirstOrDefault();
return Result == null ? \"\" : Result.Title;
}
它首先读取所有Divisons(只有3个),但这些部门在其下有许多部门作为SubTaxonomyItems。目前,我遍历每个部门并提取出每个部门,并将它们放入一个称为部门的列表中。然后,我使用Linq搜索特定项目。
它很好用,但我想跳过/使用获取子项的第一步。我尝试了以下行似乎不起作用:
TaxonomyItem Result = (from d in Departments.SubTaxonomyItems
然后,我可能会通过某种lambda并使用foreach的Departments.SubTaxonomyItems包含一个yeild语句。那可能是诀窍,但我无法使它起作用。查看yeild语句,似乎可以通过某种扩展方法来解决。但我想看看是否可以内联完成,并且类似于以下伪代码:
public string GetDepartmentTitle(string DepartmentAbbreviation) {
List<TaxonomyItem> Divisions = TaxonomyFromCMS.GetAllItems(DomainDataConstants.DivisionAndDepartment.TAXONOMY_ID);
TaxonomyItem Result = (from d in Divisions.ForEach(delegate(TaxonomyItem Division) {
yeild return Divison.SubTaxonomyItems;
}) AS Dps
where Dps.Name == DepartmentAbbreviation
select Dps).FirstOrDefault();
return Result == null ? \"\" : Result.Title;
}
这可能是这种方式还是我没有看到的其他方式?没有扩展方法也可以完成吗?
没有找到相关结果
已邀请:
5 个回复
冲汉
这正是您所做的。它从每个部门中选择部门的顺序,然后将所有这些顺序粘在一起,形成一个较长的部门顺序。 这为“将一堆序列缝在一起”方案提供了一种巧妙的语法。不过,更笼统地说,有时您会遇到这种情况:
并且您想弄清楚如何使它成为一个查询。您可以这样做:
这很丑陋,或者您可以执行以下操作:
这样做完全相同,但是阅读起来会更令人愉快。此语法称为“查询继续”。 要回答您的特定问题:在匿名方法或lambda中放置“收益率回报”是不合法的。这是非常不幸的,因为它将非常有用。编译器为使匿名函数和迭代器块起作用而执行的转换非常复杂,到目前为止,我们一直在努力使它们完全协同工作。 (也就是说,您可以将lambda放在迭代器块中,但不能将迭代器块放在lambda中。)我希望但不要保证,有一天我们将能够修复此代码并允许迭代器阻止lambda。 (请记住,Eric关于未来语言功能的想法仅出于娱乐目的。)
翱抹村
蹄寄噬非芹
疼嘶桐
垫歌蝎降凤