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

A void method that takes an IQueryable<T> and modifies it doesn't seem to persist the modifications

我有一个方法:

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);

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

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

我不确定为什么,因为 data 是参考,不是吗?所以修改我希望坚持的集合。但是我不确定 AsQueryable 是否正在创建副本或其他内容。

有什么想法吗?

"So modifying the collection I would expect to persist."

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

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

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

您应该 return 从您的方法中 IQueryable<Kitten> 并适当地分配它。