我的代码中有一个由这些行引起的错误:
var itemToExclude = _myList.First();
var nextList = _myList.Where(i => i != itemToExclude);
itemToExclude
中仍然存在nextList
。
我使用Skip(1)
而不是第二行来解决它,但是什么可能导致原始代码不起作用?
使用yield return
的函数可能与它有关。
itemsToExclude
是一个具有与
class RemainingItems
{
private readonly IEnumerable<MyObject> _myObjects;
public IEnumerable<MyObject> MyObjects { get { return _myObjects; } }
private readonly int _remaining;
public int Remaining { get { return _remaining; } }
public RemainingItems(IEnumerable<MyObject> myObjects, int remaining)
{
_myObjects = myObjects;
_remaining = remaining;
}
}
答案 0 :(得分:3)
因为myList
由yield-method提供,所以每次遍历列表时都会重新创建项目。如果你不注意,它会在每次迭代时创建新对象:
_myList.First()
_myList.Where(...)
然后将对象与!=
进行比较以获得不等式,当两个引用都指向同一个对象时(仅忽略对象的实际内容),它仅计算为false
。如上所述,yield-method可能会在每次迭代时创建新对象,因此!=
将始终为真。
有几种可能的解决方案:
.Skip(1)
.ToArray()
,这样列表只会创建一次。.Equals()
方法每个解决方案都有其权衡。