gpt4 book ai didi

c# - 在 LINQ 中嵌套 'froms'

转载 作者:可可西里 更新时间:2023-11-01 09:03:56 27 4
gpt4 key购买 nike

我是 LINQ 的新手,我对嵌套 from 有问题:

using System;
using System.Linq;
class MultipleFroms
{
static void Main()
{
char[] chrs = { 'A', 'B', 'C'};
char[] chrs2 = { 'X', 'Y', 'Z' };
var pairs = from ch1 in chrs
from ch2 in chrs2
select ch1+" "+ ch2;
Console.WriteLine("For ABC and XYZ: ");
foreach (var p in pairs)
Console.WriteLine(p);
Console.WriteLine();

Console.WriteLine("For D and W: ");
chrs = new char[] { 'D' };
chrs2 = new char[] { 'W' };
foreach (var p in pairs)
Console.WriteLine(p);
}
}

在输出中我有:

For ABC and XYZ:
A X
A Y
A Z
B X
B Y
B Z
C X
C Y
C Z

For D and W:
A W
B W
C W

但我预计:

...
For D and W:
D W

为什么 pairs 在第二种情况下使用“旧”chrs{ 'A', 'B', 'C'} 而不是 {'D'} ?

最佳答案

这个问题有几个很好的答案,这些答案很明显 - 您需要重新分配您的 pairs 变量。然而,我对奇怪的行为更感兴趣了——为什么重新分配 chrs2 会对枚举结果产生影响,而重新分配 chrs 却没有。

如果我们使用嵌套的 from-s,看起来像重新分配任何使用过的集合,除了第一个,影响枚举的结果:http://ideone.com/X7f3eQ .

现在,您可能应该知道,LINQ“查询语法”只是用于从 System.Linq 库链接扩展方法调用的语法糖。让我们为您的具体示例脱糖:

var pairs = from ch1 in chrs
from ch2 in chrs2
select ch1 + " "+ ch2;

成为

var pairs = chrs.SelectMany(ch1 => chrs2, (ch1, ch2) => ch1 + " " + ch2);

(或者,使用非扩展方法语法,SelectMany(chrs, ch1 => chrs2, (ch1, ch2) => ch1 + ""+ ch2))

(在这里查看:http://ideone.com/NjVeLD)

所以,这是怎么回事? SelectManychrs 和两个 lambda 作为参数,并从中生成一个 IEnumerable,稍后可以枚举它以开始实际计算。

现在,每当我们重新分配 chrs2 时,它都会在 lambda 中发生变化,因为它是一个捕获变量。但是,这显然不适用于 chrs!

关于c# - 在 LINQ 中嵌套 'froms',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32027811/

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