2010-01-12 4 views
-4

Voici un peu de codeComment sauter les boucles coditions pour obtenir la fonctionnalité

foreach (DataModelObject dmo in allObjects) 
{ 
    if (dmo is IResourcePolicy) 
    { 
     if (string.Compare(dmo.Name, hostName, true) == 0) 
     { 
      IResourcePolicy irp = (IResourcePolicy)dmo; 
      irp.ResourcePolicy = rp; 
      irp.AgentPolicyVersion.Version = Convert.ToInt64(policyVersion); 
      irp.ResourcePolicyEnabled = Convert.ToBoolean(enabled); 
      irp.AgentVersion = agentVersion; 

      // Distribute the object without saving it. 
      SpoServer.Spurt.ServerSendObject(dmo, true, 0); 

      break; 
     } 
    } 
} 

je veux faire exécuter cette déclaration « irp.AgentVersion = agentVersion; » sans exécuter ces trois boucles "foreach (DataModelObject dmo dans allObjects), si (dmo est IResourcePolicy), if (string.Compare (dmo.Name, hostName, true) == 0)" ,, si ces boucles sont exécutées alors je veux exécuter l'ensemble des quatre affectations à l'intérieur de la boucle, y compris l'affectation précédente (irp.AgentVersion = agentVersion;) également. Auparavant sa montrant aucune dans l'interface utilisateur sans boucle exécution ,, une fois exécutée montrant toutes les valeurs ,, que nous devons changer

Quelqu'un peut-il donner le code pour exécuter cette logique ,, est là condition de la boucle « Aller à » vérifier que nous pouvons faire ici

+2

Je vois seulement une boucle, pas trois. – RedFilter

+0

un foreach et deux If boucles – peter

+2

Je ne pense pas qu'une instruction IF est considérée comme une boucle ... – auujay

Répondre

4

Je crois que vous recherchez continue.

if (dmo is IResourcePolicy) 
{ 
    etc... 
} 
else 
{ 
    continue; 
} 

EDIT:

Sur la base des commentaires, voici ce que je comprends que vous voulez faire:

A noter également, il n'y a qu'une seule boucle ici, vous violez hors de lui une fois que votre condition interne est remplie. Je pense que c'est peut-être ce qui vous déroute. Comme c'est le cas maintenant, vous ne traiterez qu'un seul des objets de votre collection. L'instruction break a été supprimée afin de traiter tous les objets de votre collection.

+0

ce dont j'ai réellement besoin est, si ces boucles ne sont pas exécutées, je veux montrer la version d'agent au lieu de montrer Aucun dans la couche d'interface utilisateur ..Plus sur si les boucles sont exécutées je veux montrer les quatre choses, y compris la version de l'agent, je ne veux pas mettre d'autre partie supplémentaire dans les trois boucles existantes – peter

+0

comment puis-je utiliser continuer ici, mais il y a trois boucles – peter

+2

continuer est seulement fonctionnel sur opérations de boucle (while, for, for .... j'en oublie un ...) le scope (ou le '{/ * code here/*}') défini pour le conditionnel if n'est pas affecté par l'opérateur de boucle. Par conséquent, l'instruction continue provoquera le non-respect de tout code après l'instruction continue et la poursuite de la boucle avec la valeur suivante. –

-1

Je ne suis pas clair sur ce que vous essayez de faire. Est-ce proche?

foreach (DataModelObject dmo in allObjects) 
{ 
    if (dmo is IResourcePolicy) 
    { 
     IResourcePolicy irp = (IResourcePolicy)dmo; 
     irp.AgentVersion = agentVersion; 

     if (string.Compare(dmo.Name, hostName, true) == 0) 
     { 
      irp.ResourcePolicy = rp; 
      irp.AgentPolicyVersion.Version = Convert.ToInt64(policyVersion); 
      irp.ResourcePolicyEnabled = Convert.ToBoolean(enabled); 
     } 

     // Distribute the object without saving it. 
     SpoServer.Spurt.ServerSendObject(dmo, true, 0); 

     break; 
    } 
} 
+0

pas cela ne fonctionne pas, je devrais avoir besoin d'afficher la version de l'agent avant les boucles et aussi si les boucles exécutées je dois afficher toutes les valeurs, y compris la version d'agent – peter

2

Il est un peu difficile à déchiffrer ce que vous cherchez, mais je vais prendre un coup de poignard à elle:

bool objectsFound = false; 
foreach (DataModelObject dmo in allObjects) 
{ 
    if (dmo is IResourcePolicy && string.Compare(dmo.Name, hostName, true) == 0) 
    { 
     // ... 
     objectsFound = true; 
    } 
} 

if(objectsFound) 
{ 
    // "show the entire four things including agent version" 
} 
else 
{ 
    // " show agentversion instead of showing None in UI layer" 
} 
+0

Je vais avoir cette erreur – peter

+0

mais je reçois erreur, erreur Utilisation de la variable locale non affectée 'objectsFound' – peter

+1

@peter remplacer "bool objectsFound;" avec "bool objectFound = false;" – bniwredyc

1

Vous pouvez éliminer votre boucle et si les déclarations imbriquées à l'aide d'une LINQ . Voici l'idée générale:

var objects = new List<Object>(); 
objects.Add(1); 
objects.Add("string"); 
objects.Add("magic"); 
objects.Add(2.5); 

var magic = (from o in objects 
      where o is string 
       && ((string)o) == "magic" 
      select o as string).SingleOrDefault(); 

if(magic != null) { 
    Console.Write("magic found: {0}", magic); 
} 
else { 
    // Do your other logic if nothing was found (loop, etc) 
} 
+0

J'utilise le framework 2.o pas 3.5 – peter

+1

C'est dommage. Il existe des façons d'utiliser vanille LINQ en 2.0 si vous êtes intéressé: http://stackoverflow.com/questions/2138/linq-on-the-net-2-0-runtime –

+1

LINQBridge serait recommandé: http://www.albahari.com/nutshell/linqbridge.aspx. La réponse acceptée à cette question est un "hack" comme son auteur l'indique. LINQBride est mentionné mais plus tard sur la page. –

1

Voilà comment je réécrire ce code, si j'avais le luxe de .NET 3.5 ou mieux. Pas de boucles, une instruction if.

var irp = allObjects.OfType<IResourcePolicy>() 
    .FirstOrDefault(item => String.Equals(item.Name, hostName)); 

if (irp != null) 
{ 
    irp.ResourcePolicy = rp; 
    irp.AgentPolicyVersion.Version = Convert.ToInt64(policyVersion); 
    irp.ResourcePolicyEnabled = Convert.ToBoolean(enabled); 
    irp.AgentVersion = agentVersion; 

    // I don't know the signature of ServerSendObject, 
    // you might need a cast here: 
    SpoServer.Spurt.ServerSendObject(irp, true, 0); 
} 
Questions connexes