C# 为什么每次调用IEnumerable.Last()时都会得到另一个引用

C# 为什么每次调用IEnumerable.Last()时都会得到另一个引用,c#,linq,ienumerable,C#,Linq,Ienumerable,我有一个可枚举(theEnumerable)包含几个项目(引用类型) 下面的表达式theEnumerable.Last()==theEnumerable.Last()计算为false 其中: theEnumerable = Enumerable.Range(1, x).Select(x => new T()) 为什么会这样?并非所有序列都有义务以相同的顺序返回相同的值。序列可以在每次迭代时生成不同的值,或者以不同的顺序生成值 还有一种可能是,所讨论的类型具有重载的相等运算符,这会导致对

我有一个可枚举(
theEnumerable
)包含几个项目(引用类型)

下面的表达式
theEnumerable.Last()==theEnumerable.Last()
计算为
false

其中:

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

为什么会这样?

并非所有序列都有义务以相同的顺序返回相同的值。序列可以在每次迭代时生成不同的值,或者以不同的顺序生成值


还有一种可能是,所讨论的类型具有重载的相等运算符,这会导致对象与自身不相等。类型不应该这样做,但从技术上讲,它们可以做到。

根据OP评论。可枚举项的创建如下所示:

Enumerable.Range(1, x).Select(x => new T())
因此,当您执行
theEnumerable.Last()==theEnumerable.Last()
时,会发生什么情况?您将枚举
theEnumerable
两次,这意味着每次迭代
theEnumerable
时,都会执行此
Select
lambda
x=>new T()
,这意味着每次迭代都会产生不同的结果,从而导致混乱

如果你想让你的代码像你期望的那样工作。执行以下操作

var list = theEnumerable.ToList() // iterate once
list.Last() == list.Last() // I don't see how this makes sense, but I guess you have your own logic

@Psddp然后在每次迭代时创建新项。显然,这些新创建的项彼此不相等。@你是说每次我调用
.Last()
,枚举表中的项都会被重新创建?@Psddp每次调用Last,你都会执行查询,并且你已经将查询定义为创建一个新项。这消除了我对IEnumerable的一个很大的误解,我想他们和IList是一样的。非常感谢大家!将相等运算符添加到类中也会起作用吗?@mjwills,是的,它应该起作用,但这样代码将效率低下