采用 IQueryable<T> 并修改它的 void 方法似乎不会保留修改

Nib*_*Pig 0 c# iqueryable

我有一个方法:

public void ExterminateCuddlyKittens(IQueryable<Kitten> data)
{
    data = data.Where(c => !c.Cuddly);
}
Run Code Online (Sandbox Code Playgroud)

它收养了一些小猫,并带走了没有的小猫Cuddly = true

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

List<Kitten> myKittens = new List<Kitten>();
myKittens.Add(new Kitten() { Cuddly = true; });

ExterminateCuddlyKittens(myKittens.AsQueryable());

Assert.AreEqual(0, myKittens.Count);
Run Code Online (Sandbox Code Playgroud)

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

然而,当我们回到测试中时,myKittens 的计数仍然为 1,并且小猫逃脱了灭绝。

我不知道为什么,作为data参考,不是吗?因此,我希望修改集合能够持续下去。但是我不确定是否AsQueryable正在创建副本或其他内容。

有任何想法吗?

Chr*_*ris 5

“所以我希望修改集合能够持续下去。”

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

data = data.Where(c => !c.Cuddly);
Run Code Online (Sandbox Code Playgroud)

问题是这也不会修改传递到方法中的对象。data就像一个装有物体的盒子。您所做的就是data从盒子中取出原始版本并放入不同的版本。当您从该方法返回时,尽管父方法仍然具有data.

您应该IQueryable<Kitten>从您的方法返回 a 并适当地分配它。