优化查找,如 LINQ 查询

本文关键字:LINQ 查询 查找 优化 | 更新日期: 2023-09-27 18:30:26

我有一个复杂的查询。

我想根据键和值检查List (softwareLicencesList)中是否存在项目。但是,softwareLicencesList内的数据是加密的。所以首先我想解密它,然后在Dictionary (dict)内进行查找以获取映射值,然后根据hardwareInfo Keys (hardwareInfo is a Dictionary which stores machine hardware information)验证映射值。验证密钥后,我想匹配该值。

为此,我编写了以下代码段。好吧,这段代码有效,但我想知道是否可以进一步优化它。

  foreach (var i in hardwareInfo)
  {
       if (!softwareLicencesList.Exists(x => dict.FirstOrDefault(y => y.Key == Crypt.Decrypt(x.Key, "Encryption Key")).Value == i.Key
            && Crypt.VerifyHash(i.Value, "MD5", x.Value)))
             {
               //Do Something
             }
 }

解密Crypt.Decrypt()和验证哈希Crypt.VerifyHash()的过程很复杂。因此,我想尽量减少对这些函数的调用次数。

优化查找,如 LINQ 查询

您可以在代码中的多个位置提高性能。您可以使用FirstOrDefault在字典中查找与指定键匹配的值,但使用字典的全部意义在于您可以在恒定时间内查找指定键的值。此外,您无需解密双嵌套循环中的软件许可证密钥。这是非常低效的。

因此,为了改进您的代码,您可以使用解密密钥构建软件许可证列表:

var decryptedSoftwareLicenses = softwareLicenses
  .Select(softwareLicense =>
    new {
      DecryptedKey = Crypt.Decrypt(softwareLicense.Key, "Encryption key"),
      SoftwareLicense = softwareLicense
    }
  )
  .ToList();

然后,可以生成 LINQ 表达式来创建结果:

var results = hardwareInfos
  .Where(hardwareInfo =>
    !decryptedSoftwareLicenses.Any(
      decrypted =>
        dictionary[decrypted.DecryptedKey] == hardwareInfo.Key
        && Crypt.VerifyHash(hardwareInfo.Value, "MD5", decrypted.SoftwareLicense.Value)
    )
  );

您可以使用foreach迭代results或应用ToList来执行实际计算。

请注意,我将变量名称从 ixy 更改为更具描述性的名称。您选择的名称会使理解您的代码变得非常困难。