2010-10-26 6 views
1

Question: J'ai un code pour le cryptage pgp d'ici: http://blogs.microsoft.co.il/blogs/kim/archive/2009/01/23/pgp-zip-encrypted-files-with-c.aspxComment remplacer l'expression Linq Cast?

Il a la méthode ci-dessous, en utilisant certains LINQ. Je suis toujours sur. NET 2.0 et ne peut pas passer plus haut, encore ...

Comment puis-je remplacer cette expression par du code ordinaire? Je ne comprends pas vraiment Linq, je suppose qu'il fait un peu de tri?

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; 
     } 

Répondre

5

Quelque chose comme:

foreach (PgpSecretKeyRing kRing in secretKeyRingBundle.GetKeyRings()) 
{ 
    foreach (PgpSecretKey key in kRing.GetSecretKeys()) 
    { 
     if (key.IsSigningKey) 
     { 
      return key; 
     } 
    } 
} 
return null; 

foreachimplicitement effectue une distribution du type cible. Il est vrai que le LINQ original aurait été écrit plus agréablement:

return (from keyring in secretKeyRingBundle.GetKeyRings() 
     from PgpSecretKey key in keyring.GetSecretKeys() 
     where key.IsSigningKey) 
     .FirstOrDefault(); 

(. Vous peut besoin de faire la première from clause fortement typé trop, cela dépend de ce que GetKeyRings() est déclaré retourner)

+0

Comme un sidenote, vous avez omis if (key! = null), mais il doit être vérifié avant le "if (key.IsSigningKey)", donc il ressemble à 2 bugs, un dans le vôtre, un autre dans le code d'origine. Et puisque vous avez écrit "quelque chose comme", il se qualifie comme un bug, dans l'original. –

+0

@Quandary: Donc 'GetSecretKeys()' peut-il renvoyer des valeurs nulles? Cela semblerait étrange. Le résultat de 'FirstOrDefault' pourrait évidemment être nul, mais c'est une question différente. –

+0

Il pourrait, si le contenu du fichier d'entrée KeyRingBundle est incorrect. –