我有以下代码,我想加快速度:

foreach (var workflow in closedWorkflows)
{
    var w = relatedWorkflows.FirstOrDefault(r => r.Fingerprint != workflow.Fingerprint && r.TradeDate == workflow.TradeDate);
    if (w != null)
    {
        relatedWorkflows.Add(workflow);
    }
}

relatedWorkflowsclosedWorkflows是相同类型的对象列表. 我想过在FingerprintTradeDate上创建具有匿名类或二元组的查找或字典,但一个判断是针对相等的,另一个判断是针对不平等的. 在TradeDate上创建查找,然后在Fingerprint上 for each TradeDate的查找列表创建查找是一个好方法吗?

Updated:

感谢@Dmitry Bychenko.

在我的测试中,差异是41486 ms与26 ms!

推荐答案

性能的主要问题在于

var w = relatedWorkflows.FirstOrDefault(...)

我们一遍又一遍地扫描relatedWorkflows,这就是为什么我们有O(closedWorkflows.Count * relatedWorkflows.Count)时间复杂度. 我们可以借助基于哈希的集合(字典和哈希集)来删除relatedWorkflows.Count,例如

var dict = workflow
  .GroupBy(item => item.TradeDate, item => item.FingerPrint)
  .ToDictionary(group => group.Key, group => group.ToHashSet());

foreach (var workflow in closedWorkflows) {
  // If we have a date, but NOT print we add it into relatedWorkflows
  if (dict.TryGetValue(workflow.TradeDate, out var prints) && 
      prints.Add(workflow.Fingerprint)) {
    relatedWorkflows.Add(workflow);
  }
}

Csharp相关问答推荐

为什么使用DXGI输出复制和Direct 3D时捕获的图像数据全为零?

. NET 8 HttpClient post参数将其情况更改为camel'

使用客户端密钥为Fabric Rest API生成令牌

AsNoTrackingWithIdentitySolutions()似乎不起作用?

Azure Redis缓存与Entra ID身份验证

无法通过绑定禁用条目

如何在C#中使用Postman中的本地IP向本地主机上运行的本地API发出请求

如何在C#中实现非抛出`MinBy`?

CA1508:';NULL=>;TRUE;始终为';TRUE';.移除或重构条件(S)以避免死代码

Content WithTargetPath实际上是有效的MSBuild项吗?

如何让游戏对象在切换场景时被销毁,但在开始新游戏时重新锁定

将J数组转换为列表,只保留一个嵌套的JToken

如何解决System.StackOverflowException:抛出System.StackOverflowException类型的异常.&# 39;生成随机代码时发生异常?

try 访问字典中的模拟对象时引发KeyNotFoundException

将两个for循环更改为一条LINQ语句

使用免费的DotNet库从Azure函数向Azure文件共享上的现有Excel文件追加行

C#;AvaloniaUI;MVVM;当另一个窗口上的按钮被单击时,如何更新视图图像源?

使用本地公共PEM文件加密字符串,使用Azure KayVault中的私钥解密

如何将行添加到DataGrid以立即显示它?

无法创建&Quot;&Quot;类型的实例,因为无法将一个或多个参数绑定到