采用 IQueryable 并对其进行修改的 void 方法<T>似乎不会保留修改



我有一个方法:

public void ExterminateCuddlyKittens(IQueryable<Kitten> data)
{
data = data.Where(c => !c.Cuddly);
}

它收留了一些小猫,并删除了任何没有Cuddly = true的小猫。

我用这段代码测试了这个方法:

List<Kitten> myKittens = new List<Kitten>();
myKittens.Add(new Kitten() { Cuddly = true; });
ExterminateCuddlyKittens(myKittens.AsQueryable());
Assert.AreEqual(0, myKittens.Count);

调试我的方法时,智能感知显示它正确地消灭了小猫,并且在方法的末尾有一个空集合。

然而,一旦我们回到测试中,myKittens的计数仍然是1,小猫已经逃脱了灭绝。

我不知道为什么,因为data是一个参考,不是吗?因此,修改集合我希望保留。但是我不确定AsQueryable是在创建副本还是其他东西。

有什么想法吗?

"所以修改集合,我希望能坚持下去。

问题是你没有修改集合。data.Where(c => !c.Cuddly)不会修改数据。它基于数据返回一个新对象。自从你这样做以来,你似乎有这个想法:

data = data.Where(c => !c.Cuddly);

问题是这也不会修改传递给方法的对象。data就像一个装有物体的盒子。你所做的是把原来的data从盒子里拿出来,然后放一个不同的。当您从该方法返回时,父方法仍然具有data的原始未修改版本。

应从方法中返回IQueryable<Kitten>并适当地分配它。

最新更新