gpt4 book ai didi

c# - 如何在 Linq 查询中使用 Yield

转载 作者:行者123 更新时间:2023-11-30 18:57:27 24 4
gpt4 key购买 nike

我有以下方法:

    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;
}

它首先读取所有部门(只有 3 个部门),但这些部门下面有许多部门作为 SubTaxonomyItems。目前,我遍历每个部门并提取每个部门并将它们放在一个名为 Departments 的列表中。然后我使用 Linq 搜索特定项目。

效果很好,但我想跳过/使用获取子项的第一步。我尝试了以下似乎不起作用的行:

TaxonomyItem Result = (from d in Departments.SubTaxonomyItems

然后我可能会通过某种 lambda 和包含 yield 语句的 Departments.SubTaxonomyItems 的 foreach。这可能是诀窍,但我无法让它发挥作用。查看 yield 语句,如果我做一些扩展方法,似乎有办法。但我想看看它是否可以内联完成,并且喜欢下面的伪代码:

    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;
}

这可能是这种方式还是我没有看到的其他方式?甚至可以在没有扩展方法的情况下完成吗?

最佳答案

首先,您只需在查询中添加另一个“from”即可轻松解决您的问题:

var query = from division in divisions
from department in division.Departments
where department.Name == whatever
select department;

这正是您所做的;它从每个部门中选择部门序列,并将所有这些序列粘合在一起,形成一长串部门。

这为“将一堆序列拼接在一起”场景提供了一个灵活的语法。不过,更一般地说,有时您会遇到这种情况:

var bars = from foo in foos
some complicated query logic here
select foo.bar;
var abcs = from bar in bars
some other query logic here
select bar.abc;

并且您想弄清楚如何将其变成一个查询。你可以这样做:

var abcs = from bar in (
from foo in foos
some complicated query logic here
select foo.bar)
some other query logic here
select bar.abc;

这很,或者你可以这样做:

var abcs = from foo in foos
some complicated query logic here
select foo.bar into bar
some other query logic here
select bar.abc;

这完全一样,但读起来更愉快。这种语法称为“查询延续”。

回答您的具体问题:在匿名方法或 lambda 中放置“ yield 返回”是不合法的。这是非常不幸的,因为它真的很有用。编译器为使匿名函数和迭代器 block 工作而执行的转换非常复杂,到目前为止,我们一直致力于让它们完全协同工作。 (也就是说,你可以将 lambda 放在迭代器 block 中,但你不能将迭代器 block 放在 lambda 中。)我希望,但不保证,有一天我们能够修复这段代码并允许迭代器 block lambda。 (请记住,Eric 对 future 语言功能的思考仅供娱乐。)

关于c# - 如何在 Linq 查询中使用 Yield,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5746254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com