C# 如何替换Linq强制转换表达式?
问题:我这里有一些pgp加密代码: 它有下面的方法,使用一些LINQ。 我仍然在.NET2.0上,无法切换到更高的版本,但是 如何用普通代码替换此表达式? 我真的不明白Linq,我想它做了一些排序C# 如何替换Linq强制转换表达式?,c#,.net,linq,pgp,openpgp,C#,.net,Linq,Pgp,Openpgp,问题:我这里有一些pgp加密代码: 它有下面的方法,使用一些LINQ。 我仍然在.NET2.0上,无法切换到更高的版本,但是 如何用普通代码替换此表达式? 我真的不明白Linq,我想它做了一些排序 private PgpSecretKey GetFirstSecretKey(PgpSecretKeyRingBundle secretKeyRingBundle) { foreach (PgpSecretKeyRing kRing in secretKey
private PgpSecretKey GetFirstSecretKey(PgpSecretKeyRingBundle secretKeyRingBundle)
{
foreach (PgpSecretKeyRing kRing in secretKeyRingBundle.GetKeyRings())
{
PgpSecretKey key = kRing.GetSecretKeys()
.Cast<PgpSecretKey>()
.Where(k => k.IsSigningKey)
.FirstOrDefault();
if (key != null)
return key;
}
return null;
}
private PgpSecretKey GetFirstSecretKey(PgpSecretKeyRingBundle secretKeyRingBundle)
{
foreach(secretKeyRingBundle.GetKeyRings()中的pgpsecretkeyringkring)
{
PgpSecretKey=kRing.getsecretkey()
.Cast()
.Where(k=>k.IsSigningKey)
.FirstOrDefault();
if(key!=null)
返回键;
}
返回null;
}
类似于:
foreach (PgpSecretKeyRing kRing in secretKeyRingBundle.GetKeyRings())
{
foreach (PgpSecretKey key in kRing.GetSecretKeys())
{
if (key.IsSigningKey)
{
return key;
}
}
}
return null;
foreach
隐式执行对目标类型的强制转换。诚然,最初的LINQ应该写得更令人愉快:
return (from keyring in secretKeyRingBundle.GetKeyRings()
from PgpSecretKey key in keyring.GetSecretKeys()
where key.IsSigningKey)
.FirstOrDefault();
(您可能需要将第一个from
子句也强类型化;这取决于GetKeyRings()
声明返回的内容。)类似于:
foreach (PgpSecretKeyRing kRing in secretKeyRingBundle.GetKeyRings())
{
foreach (PgpSecretKey key in kRing.GetSecretKeys())
{
if (key.IsSigningKey)
{
return key;
}
}
}
return null;
foreach
隐式执行对目标类型的强制转换。诚然,最初的LINQ应该写得更令人愉快:
return (from keyring in secretKeyRingBundle.GetKeyRings()
from PgpSecretKey key in keyring.GetSecretKeys()
where key.IsSigningKey)
.FirstOrDefault();
(您可能还需要将from子句的第一个
强类型化;这取决于GetKeyRings()
声明返回的内容。)作为旁注,您省略了if(key!=null),但需要在“if(key.IsSigningKey)”之前检查它,因此它看起来像两个bug,一个在您的代码中,另一个在原始代码中。既然您编写了“类似”的东西,那么它在原始版本中就被定义为一个bug。@困惑:那么GetSecretKeys()
是否可以返回空值?这似乎很奇怪。FirstOrDefault
的结果显然可能为空,但这是另一回事。如果KeyRingBundle输入文件的内容不正确,则可能为空。@Quandary:在这种情况下,为什么不抛出异常呢?现在还不清楚您是否在猜测它可能存在,或者您是否知道这种情况。作为旁注,您省略了if(key!=null),但需要在“if(key.IsSigningKey)”之前检查它,因此它看起来像两个bug,一个在您的代码中,另一个在原始代码中。既然您编写了“类似”的东西,那么它在原始版本中就被定义为一个bug。@困惑:那么GetSecretKeys()
是否可以返回空值?这似乎很奇怪。FirstOrDefault
的结果显然可能为空,但这是另一回事。如果KeyRingBundle输入文件的内容不正确,则可能为空。@Quandary:在这种情况下,为什么不抛出异常呢?现在还不清楚你是否在猜测它可能会发生,或者你是否知道是这样。