我有一个复杂的查询。
我想根据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()
的过程非常复杂。所以我想尽量减少对这些函数的调用次数。
答案 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
来执行实际计算。
请注意,我将变量名称从i
,x
和y
更改为更具描述性的名称。您选择的名称使您很难理解您的代码。