Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
批量更新字典中多条记录的属性(VB.NET/C#)_C#_.net_Vb.net_Linq_Dictionary - Fatal编程技术网

批量更新字典中多条记录的属性(VB.NET/C#)

批量更新字典中多条记录的属性(VB.NET/C#),c#,.net,vb.net,linq,dictionary,C#,.net,Vb.net,Linq,Dictionary,我有一个字典(Long,Class),其中Class有多个属性(假设我们有一个名为Updated as Boolean的属性) 我想将所有奇数键记录(或基于任何特定规则)的这个(更新的)属性一次更新为(True)。最好的方法是什么 我的想法是使用Linq来获取这些记录,然后(针对每个记录)获取它们,但是有没有更好的方法来实现这一点,比如在发生情况时进行大规模更新(比如我们在数据库中所做的) 下面是我的方法的一个例子。如果有更好的方法进行更新,我将不胜感激 谢谢 Dim ReturnedObjs

我有一个字典(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

首先,这听起来像是速度咆哮的一个明显例子:

第二:

最好的方法是将其保存在数据库中。通过在网络上传输数据两次(一次获取数据,一次返回数据)并加倍搜索负载(一次获取所有奇数数据,一次更新所有刚更改的数据),使用为快速匹配而设计的索引,您不会超过DB查询的速度。我的长期建议是,始终尽可能多地在DB方面工作。你的客户端代码永远无法战胜它

第三:

如果您确实需要使用客户端处理:

现在,我的很多答案取决于实现的细节、JiT和通用编译器优化的工作方式等

Foreach使用枚举数,而不是集合。但如果将集合馈送给foreaach,则会隐式创建枚举数。现在,枚举数有两个属性:

  • 如果集合发生更改,枚举数将变为无效。大多数人了解他们是因为他们遇到了这个问题
  • 它是一个额外的函数调用和一组用于访问集合的检查。因此,这将是一个减速。多少很难说,因为优化和JiT都很好
  • 所以您可能希望使用for循环


    如果您可以将字典转换为一个以主键作为索引的集合,那么速度可能会快一点。但是,hat有陷入大量数据“枯燥期”的危险,因此它在很大程度上取决于您的源数据。

    这听起来像是速度咆哮的例子:那么您当前的方法有什么问题?你想修复什么?如果你的数据是每100毫秒一次,并且你想更新10万条记录(甚至更多),这将非常有用:)我正试图以最好的方式对此进行优化。如果有一种直接更新所有记录的方法,这将非常好(例如,当我们在SQL中说'update Table Set Property=True where Value>0'时),您可以为Linq的每个循环编写一个等价的
    ,但即使这样,您也只是隐藏了迭代。我看不出重点;相当多的Linq对于查询理解或延迟执行是有用的,这两个目的都不起作用。您需要进行迭代,最好将其显式化(特别是当您需要更新枚举变量的多个属性时)。我知道一种方法来实现这一点(我把它放在上面,可能会帮助别人),我正在寻找更好的东西,如果存在的话(学习新的东西总是好的)。如果有更好的方法做某事,那么为什么不以正确的方式做呢?即使它运行正常。让我们假设我是一个完美主义者,喜欢以最好的方式做事:)现在回答你剩下的问题;)第二点,不幸的是在DB上这样做不是一个选项。。。数据实际上来自前端。将其发送到要在数据库中处理的服务器(对于许多用户)将消耗服务器资源。这就是为什么像我在文章中描述的那样,使用LINQ语句中的更新来分发每个前端的处理更好的原因。对于第三个建议,我将检查“For循环”,感谢对“For Each”的详细解释。我希望有一种方法可以在不迭代的情况下进行大规模更新:)@AhmadMusa我希望通过所有这些分离层,你考虑了比赛条件?特别是更新竞争条件可能导致更新丢失,这听起来像是他们的理想繁殖地。@christopher这与竞争条件场景无关。如前所述,我只是想看看是否有更好的方法来做这样的更新,我不知道。代码正在运行,我没有抱怨。但是对于大量的记录,cpu将开始增加(显然)。所以我想知道我们是否缺少了一种不同的技术(搜索了几个网站却没有找到任何东西,因此我在这里提出了问题)。谢谢:)