像LINQ查询一样优化LookUp

时间:2014-11-14 09:11:16

标签: c# linq dictionary

我有一个复杂的查询。

我想根据Key和值检查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()的过程非常复杂。所以我想尽量减少对这些函数的调用次数。

1 个答案:

答案 0 :(得分:0)

您可以提高代码中多个位置的性能。您使用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)
    )
  );

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

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