我有一个字典(Long,Class),其中 Class 有多个属性(假设我们有一个名为 Updated as Boolean 的属性)。
我想立即将此(更新)属性更新为(True),假设所有奇数关键记录(或基于任何特定规则)。最好的方法是什么?
我的想法是使用 Linq 来获取这些记录,然后(针对每个)它们,但是有没有更好的方法可以做到这一点,例如在发生条件时进行批量更新(就像我们在数据库中所做的那样)?
我的方法的一个例子如下。如果有更好的方法来进行此类更新,我们将不胜感激...
谢谢
Dim ReturnedObjs = From Obj In Dictionary Where Obj.Key Mod 2 = 1
For Each item As KeyValuePair(Of Long, Class) In ReturnedObjs
item.Value.Updated = True
Next
最佳答案
首先,这听起来像是一个明显的速度咆哮案例:
https://ericlippert.com/2012/12/17/performance-rant/
第二:
最好的方法是将其保存在数据库中。通过网络传输数据两次(一次获取数据,一次返回数据)并将搜索负载加倍(一次获取所有奇数),您将无法超越带有专为快速匹配而设计的索引的数据库查询的速度,一次更新您刚刚更改的所有内容)。我的长期建议是始终将尽可能多的工作放在数据库方面。您的客户端代码将永远无法击败它。
第三:
如果您确实需要使用客户端处理:
现在我的很多答案取决于实现的细节、JiT 和一般编译器优化的工作方式等。
Foreach 适用于枚举器,而不适用于集合。但是,如果将集合提供给 foreaach,则会隐式创建一个枚举器。现在枚举器确实有两个属性:
- 如果集合发生变化,枚举器将变得无效。大多数人了解它们是因为他们遇到了这个问题。
- 这是一个额外的函数调用和一组用于访问集合的检查。所以这将会是一个放缓。很难说多少,因为优化和 JiT 都非常好。
所以你可能想使用 for 循环。
如果你可以将字典变成一个集合,其中主键用作索引,它可能会快一点。但是,这存在遇到大量数据“干涸期”的危险,因此这在很大程度上取决于您的源数据。
关于c# - 批量更新字典内多个记录的属性 (VB.NET/C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58806385/