C# 加入Linq

C# 加入Linq,c#,linq,C#,Linq,当我宣布 int[] a = { 1, 2 ,10,30}; int[] b = { 10, 20, 30 }; var q = from item1 in a join item2 in b on item1 equals item2 into g select g 1) 什么是真正被选入g?很难将理解为关键字。如

当我宣布

 int[] a = { 1, 2 ,10,30};

 int[] b = { 10, 20, 30 };

  var q = from item1 in a
                     join item2 in b
                     on item1 equals item2
                     into g
                     select g
1) 什么是真正被选入g?很难将
理解为
关键字。如果你举个例子把关键字
”解释成“
,我会很高兴的

(二)

在第2行中,我们使用“b”选择项目 在第3行中,我们也使用相同的b,这是否意味着我们覆盖了我们选择的数据 在第2行?

1)您正在执行a。
g
将是
a
g中每个元素的
i分组
。Key
将是
a
中的元素,而
g
(实现
IEnumerable
)将包含
b
中的所有匹配元素。要完全理解这一点,请在中尝试。另外,请阅读


2)
into
关键字将第一个
b
合并到
b_join
,这将是一个
I分组
。之后,第一个
b
不再在范围内。

如果对编译的代码使用.NET Reflector,您可以看到第一个查询相当于以下内容:

IEnumerable<IEnumerable<int>> q = a.GroupJoin(b,
   item1 => item1,
   item2 => item2,
   (item1, group) => group);
IEnumerable q=a.GroupJoin(b,
item1=>item1,
item2=>item2,
(项目1,组)=>组);
请注意,您正在执行组联接,但仅返回组。请将其与普通联接进行比较:

IEnumerable<int> q = a.Join(b,
    item1 => item1,
    item2 => item2,
    (item1, item2) => item2);
IEnumerable q=a.Join(b,
item1=>item1,
item2=>item2,
(第1项、第2项)=>第2项;
这将返回b中与每个a匹配的元素(如果存在任何此类元素)

IEnumerable<int> q = a.Join(b,
    item1 => item1,
    item2 => item2,
    (item1, item2) => item2);