代码之家  ›  专栏  ›  技术社区  ›  Stefan Steiger Marco van de Voort

如何替换LINQ CAST表达式?

  •  1
  • Stefan Steiger Marco van de Voort  · 技术社区  · 15 年前

    问题:我这里有一些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;
            }
    
    1 回复  |  直到 15 年前
        1
  •  5
  •   Jon Skeet    15 年前

    比如:

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