gpt4 book ai didi

c# - 此 Linq 表达式的基于方法的查询

转载 作者:行者123 更新时间:2023-11-30 21:47:59 25 4
gpt4 key购买 nike

大家好,

        Employee[] empCollection =
new Employee[]{

new Employee()
{
Name = "Test1",
Salry = "1000",
Notes = new string[] { "A","B","C","D"}
},

new Employee()
{
Name = "Test2",
Salry = "2000",
Notes = new string[] { "E","F","G","H"}

}

};


var data = from e in empCollection
from n in e.Notes
select new { Name = e.Name, note = n };

测试1:B测试1:C测试1:D测试2:E测试2:F测试2:G测试2:H

我想知道这个查询的基于 synatx 的等效方法?

我试过了

var data = empCollection.Select(
e =>
e.Notes.Select(n => new
{
name = e.Name,
note = n
}
)
);

但我无法在 foreach 循环中获取姓名和备注,为什么?

谢谢。

最佳答案

您的代码返回 IEnumerable<IEnumerable<T>> , 你需要使用 SelectMany将结果“扁平化”为 IEnumerable<T> :

var data = empCollection
.SelectMany(e => e.Notes.Select(n => new {name = e.Name, note = n}));

根据 the documentation ,您的原始编译器从查询到方法语法完成的机械翻译使用了 SelectMany 的重载,创建一个匿名类型来配对这两个项目,以便它们可以在投影中使用(请注意,由于编译器发明的变量名称,这实际上不会编译):

var data = empCollection
.SelectMany(e => e.Notes, (e, n) => new {e, n})
.Select($1 => new { name = $1.e.Name, note = $1.n });

当然,这可以被简化,你最终会在编译器生成的代码和你的原始代码之间的某个地方结束:

var data = empCollection
.SelectMany(e => e.Notes, (e, n) => new {name = e.Name, note = n});

参见 this fiddle用于演示。

关于c# - 此 Linq 表达式的基于方法的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38012246/

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