等于(LINQ)和==(C#)运算符之间的差

本文关键字:之间 运算符 等于 LINQ | 更新日期: 2023-09-27 18:29:57

我一直在阅读在Microsoft.NET Framework 4中编程Microsoft LINQ,现在我理解了LINQ中的join子句,但我对它的定义有疑问;在书中它被定义为:

只能通过使用与==运算符不同的特殊equals关键字来定义相等比较,因为操作数的位置很重要。对于equals,左键消耗外部源序列,右键消耗内部源序列。外部源序列仅在equals左侧的范围内,内部源序列仅位于右侧的范围内。

关于这个算子还有一个正式的定义:

join-clause ::= join innerItem in innerSequence on outerKey equals innerKey

请有人用其他语言或转述的方式向我解释上述概念好吗?

等于(LINQ)和==(C#)运算符之间的差

我想这是因为联接中的"equals"不像==那样工作,所以语言设计者决定不调用它正在做的事情。

在C#中,a==b与b==a完全相同。在连接的定义中,情况并非如此:

var list = from a in ctx.TableA
           join b from ctx.TableB on a.Id equals b.tableAId

如上所述,这是有效的。

var list = from a in ctx.TableA
           join b from ctx.TableB on b.tableAId equals a.Id

这将不会编译。语言规范规定,必须首先指定"外部"表(本例中为TableA),其次必须指定内部表(TableB)。我想语言设计者认为这与==的工作方式有很大的不同,使用它是个坏主意,他们想出了使用"equals"的想法。

我想我可能是对的,但只有相关的语言设计师才会真正知道真相。