为什么每次调用IEnumerable.Last()都会获得另一个引用

时间:2018-07-26 20:55:32

标签: c# linq ienumerable

我有一个枚举(theEnumerable),其中包含若干项(引用类型)。

以下表达式theEnumerable.Last() == theEnumerable.Last()的计算结果为false

其中:

theEnumerable = Enumerable.Range(1, x).Select(x => new T()) 

那是为什么?

2 个答案:

答案 0 :(得分:4)

并非所有序列都必须以相同的顺序返回相同的值。序列每次迭代都可以产生不同的值,或者以不同的顺序产生这些值。

所讨论的类型也可能具有重载的等于运算符,从而导致对象与其自身不相等。类型永远不会做到这一点,但是从技术上讲,它们可以做到。

答案 1 :(得分:4)

根据OP注释。可枚举创建如下:

Enumerable.Range(1, x).Select(x => new T())

因此,当您执行theEnumerable.Last() == theEnumerable.Last()时,会两次枚举theEnumerable,这意味着每次迭代{{1}时都会执行一次Select lambda x => new T() },意味着每次迭代都会产生不同的结果,从而造成混乱。

如果您希望自己的代码像期望的那样工作。执行以下操作。

theEnumerable