1

问题:我有一些用于 pgp 加密的代码:http: //blogs.microsoft.co.il/blogs/kim/archive/2009/01/23/pgp-zip-encrypted-files-with-c.aspx

它具有以下方法,使用一些 LINQ。我仍在使用 .NET 2.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;
        }
4

1 回答 1

5

就像是:

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()声明返回的内容。)

于 2010-10-26T11:26:20.330 回答