等于(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
请有人用其他语言或转述的方式向我解释上述概念好吗?
我想这是因为联接中的"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"的想法。
我想我可能是对的,但只有相关的语言设计师才会真正知道真相。