c# - 批量更新字典内多个记录的属性 (VB.NET/C#)

标签 c# .net vb.net linq dictionary

我有一个字典(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,则会隐式创建一个枚举器。现在枚举器确实有两个属性:

  1. 如果集合发生变化,枚举器将变得无效。大多数人了解它们是因为他们遇到了这个问题。
  2. 这是一个额外的函数调用和一组用于访问集合的检查。所以这将会是一个放缓。很难说多少,因为优化和 JiT 都非常好。

所以你可能想使用 for 循环。

如果你可以将字典变成一个集合,其中主键用作索引,它可能会快一点。但是,这存在遇到大量数据“干涸期”的危险,因此这在很大程度上取决于您的源数据。

关于c# - 批量更新字典内多个记录的属性 (VB.NET/C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58806385/

相关文章:

c# - 将字符串转换为 TitleCase、SentenceCase、UpperCase 和 LowerCase,但如果单词在 "quotation marks"内则忽略大小写

c# - 针对无效字符验证电子邮件地址

c# - 如何在 UWP 应用程序中通过 log4net 配置日志记录

.net - 在.NET远程调用期间识别客户端

vb.net - 在 VB.NET 中重载 Equals/GetHashCode 以将对象用作字典键

.net - 如何使用自定义结构代替 KeyValuePair?

c# - 如何检测 COM 应用程序当前是否正在运行?

c# - HttpRequest 与 HttpWebRequest

.net - 没有 key 的 Entity Framework 删除

.net - 什么是 Powershell(dotnet global)