c# - linq 查询是否可以更改其数据源,即字典的内容?

标签 c# linq

在我看来,Linq 只能“查询”给定的数据源,也就是说,它浏览它并根据需要从中返回内容,但不会更改任何内容。然而,我在这个问题上找到的一些答案中的措辞让我怀疑这种理解。我的理解在所有情况下都是正确的吗? linq 查询是否可以更改与其关联的数据源的内容?

最佳答案

Can a linq query -ever- change the content of the data source it is associated to?

是的,尽管这是个坏主意。

LINQ 查询(至少使用 LINQ to Objects)通过使用委托(delegate)进行过滤或映射操作来工作。一般来说,这些不应该引起副作用,但这并不意味着如果您强制它们,它们不能这样做。实际的 LINQ 方法不会更改数据,但它们通过仅是您提供的代码的委托(delegate)工作,这意味着代码可以做任何事情。

请注意,这通常不是一个好主意。

例如,假设您正在对 Person 的集合进行查询实例:

var results = people.Where(p => p.Name == "Foo")
                    .Select(p =>
                            {
                               // This is evil, don't do it!
                               p.Name = "Bar";
                               return p;
                            });

也就是说,这不太可能与 LINQ 一起针对 IQueryable<T> 工作.在这种情况下,您提供的 lambda 将被转换为 Expression。 ,这又需要由提供者翻译成其他形式(即: Entity Framework 将其转换为 SQL)。因此,如果提供程序的编写方式可以将其转化为有意义的形式,那么您将只能产生副作用,而这种情况不太可能发生。

关于c# - linq 查询是否可以更改其数据源,即字典的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19306686/

相关文章:

c# - 如何在 WPF 中播放 Youtube 视频

c# - 如何避免 linq 查询 C# 中的两个嵌入式循环

c# - Linq to Xml 查询

多维数组上的 C# LINQ 查询

c# - 何时使用 ReleaseComObject 与 FinalReleaseComObject?

c# - 如何处理 system.net.mail.smtpfailedrecipientsexception 失败的收件人

javascript - 如何在回发中显示面板?

c# - 关于Singleton C#的两个问题

c# - 具有多个where参数的linq to sql查询

c# - 为什么在将 First() 应用于投影时此 linq 代码会呈指数级变慢?