【发布时间】:2022-01-23 07:57:01
【问题描述】:
我有一组对象以IEnumerable 的形式输入一个方法,我按引用属性对它们进行分组,然后逐组处理它们。该处理涉及改变对象的其他属性。当方法完成并返回时,调用者期望它传入的对象集合被改变。整个过程是异步的,方法如下:
public async Task MutateMyObjects(IEnumerable<MyObjects> myObjects,
CancellationToken cancellationToken)
{
var myObjectsGroupedByGroupingEntity = myObjects
.GroupBy(myObject => myObject.GroupingEntity);
foreach (var myObjectGroup in myObjectsGroupedByGroupingEntity )
{
await ProcessGroup(myObjectGroup.Key, myObjectGroup, cancellationToken);
}
}
MyObject 和 GroupingEntity 都是类,因此我的期望是 MyObjects 作为引用类型传递,并且变异是整个过程固有的。
实际发生的是MutateMyObjects 的调用者观察到的MyObjects 的属性值与它在方法调用之前观察到的相同。在Task 完成后观察到这些结果。在调试上述方法时,观察方法返回前的变量状态,发现变量myObjectGroup下的对象集合包含了变异的属性,而变量myObjects下的对象集合没有。
我不确定我的理解缺少哪些方面导致我得到错误的期望,任何见解将不胜感激。
【问题讨论】:
-
你传递给方法的是什么?如果它类似于
someList.Select(x => new MyObjects(x)),那么每次迭代都会创建新对象。你可以将它传递给MutateMyObjects,它会改变它创建的对象,但如果你再次迭代IEnumerable,它会创建全新的未变异对象。 -
IEnumerable<MyObjects>是否会再次访问您的数据库以获取新数据? -
@Llama 那是在工作完成之后——这不是我真正的意思——你不能在异步函数中使用 myObj 并在它工作的同时观察它的变化
-
@riffnl 我明白了,我误解了你的评论。
-
@juharr 感谢您的问题,我查看了数据源,这是一个使用 Select 管道传输到映射器的 LINQ to SQL 查询。因此,我通过在映射 Select 之后添加 ToList() 调用来执行查询,现在由于您所描述的,对象突变仍然存在。
标签: c# linq linq-to-objects .net-6.0