采用 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>
并适当地分配它。
我有一个方法:
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>
并适当地分配它。