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
lambdax=>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,是的,它应该起作用,但这样代码将效率低下