Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ从多个序列进行投影?_C#_Linq - Fatal编程技术网

C# 如何使用LINQ从多个序列进行投影?

C# 如何使用LINQ从多个序列进行投影?,c#,linq,C#,Linq,全部 我有三个收藏: {"Alex", "Anna"} {19, 20} {"A", "B"} 我想使用LINQ和以下lambda或其他东西将它们全部投影到一个类型为“Student”的对象序列中: (name, age, grade)=>new Student(name, age, grade) 结果应该是两个学生对象(“Alex”,19,“A”)和(“Anna”,20,“B”) 我如何才能做到这一点?您可以将两个Zip组合起来实现这一点: names.Zip(ages, (n,a)

全部

我有三个收藏:

{"Alex", "Anna"}
{19, 20}
{"A", "B"}
我想使用LINQ和以下lambda或其他东西将它们全部投影到一个类型为“Student”的对象序列中:

(name, age, grade)=>new Student(name, age, grade)
结果应该是两个学生对象(“Alex”,19,“A”)和(“Anna”,20,“B”)


我如何才能做到这一点?

您可以将两个
Zip
组合起来实现这一点:

names.Zip(ages, (n,a) => new { name = n, age = a })
     .Zip(grades, (s,g) => new Student { Name = s.name, Age = s.age, Grade = g });

我会使用
Zip

var names = new[] {"Alex", "Anna"};
var ages = new[] {19, 20}
var grades = new[] {"A", "B"}


var students = names.Zip(ages, (n, a) => Tuple.Create(n, a))
                    .Zip(grades, (t, g) => new Student(t.Item1, t.Item2, g));

这些序列是如何定义的?我是说他们的
类型
?您的问题不清楚。到目前为止,您已经提供了要求,但没有问题。我假设问题是“我该怎么做?”。C没有序列。你想把F代码转换成C代码吗?LINQ允许压缩两个枚举数,但三个是不同的情况。它们是三个简单的枚举数、数组或列表。我喜欢元组的可能重复项,这是极少数有用的情况之一。@PanagiotisKanavos-请参阅我对您对Selman答案的相同评论的回复。在回顾中如此明显!结果是可枚举的,因此lambda总是惰性地进行评估。可数永远令人惊奇me@AndrewShepherd:与竞争对手匿名类型相比,这不是真正的优势,因为他们也提供匿名类型。元组的唯一优点是可以用不同的方法处理它们。@AndrewShepherd:有趣的是顺序很重要,您可以在这里阅读:我认为您的匿名类比我的元组更具可读性。双压缩解决方案在前两个序列上迭代两次。对于数据处理场景,这是不可取的。我将尝试编写一个三向Zip,但我想知道是否有库已经这样做了。@PanagiotisKanavos实际上,只有一个迭代。第一λ和第二λ连续交错。看看这个dotnetfiddle的例子:@PanagiotisKanavos似乎是这样