equals(LINQ)和==(C#)运算符之间的区别?

时间:2014-11-10 14:19:00

标签: c# linq

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

  

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

还有关于此运算符的正式定义:

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

请问,有人可以用其他话语或通过解释来解释我的上述概念吗?

1 个答案:

答案 0 :(得分:10)

我想这是因为连接中的'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)必须是第二个。我认为语言设计者认为这与==的工作方式有很大的不同,使用它并不是一个坏主意,他们想出了使用'等于'的想法。

我想我可能是对的,但只有所涉及的语言设计师才能真正了解真相。