C# 如何替换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

问题:我这里有一些pgp加密代码:

它有下面的方法,使用一些LINQ。 我仍然在.NET2.0上,无法切换到更高的版本,但是

如何用普通代码替换此表达式? 我真的不明白Linq,我想它做了一些排序

 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:在这种情况下,为什么不抛出异常呢?现在还不清楚你是否在猜测它可能会发生,或者你是否知道是这样。