Как пропустить циклы для получения функциональности - PullRequest
0 голосов
/ 12 января 2010

Вот немного кода

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

я хочу выполнить это утверждение "irp.AgentVersion = agentVersion;" без выполнения этих трех циклов "foreach (DataModelObject dmo в allObjects), если (dmo - IResourcePolicy), if (string.Compare (dmo.Name, hostName, true) == 0) ",, если эти циклы выполняются, то я хочу выполнить все четыре назначения внутри цикла, включая предыдущее назначение (irp.AgentVersion = agentVersion;) также. Ранее он не отображал ничего в пользовательском интерфейсе без выполнения цикла, после выполнения показывает все значения, которые нам нужно изменить

Может ли кто-нибудь дать код для выполнения этой логики, если есть проверка состояния цикла "Goto", которую мы можем сделать здесь

Ответы [ 5 ]

4 голосов
/ 12 января 2010

Я полагаю, вы ищете продолжить .

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

EDIT:

Основываясь на комментариях, я понимаю, что вы хотите сделать:

Также отметим, что здесь есть только один цикл, и вы выходите из него, как только ваше внутреннее условие выполнено Я думаю, что это может вас смущать. Как сейчас, вы всегда будете обрабатывать только один из объектов в вашей коллекции.

Следующее удаляет оператор break, поэтому он будет обрабатывать каждый объект в вашей коллекции.

foreach (DataModelObject dmo in allObjects)
{
    if (dmo is IResourcePolicy)
    {
         // if these loops are not executed i want to show agentversion instead of showing None in UI layer
         IResourcePolicy irp = (IResourcePolicy)dmo;
         irp.AgentVersion = agentVersion;

         //(else) i want to show the entire four things including agent version
         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);
    }
}
2 голосов
/ 12 января 2010

Немного сложно расшифровать то, что вы ищете, но я попробую:

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"
}
1 голос
/ 12 января 2010

Вот как бы я переписал этот код, если бы у меня была роскошь .NET 3.5 или выше. Без циклов, один оператор 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);
}
1 голос
/ 12 января 2010

Вы можете исключить ваш цикл и вложенные операторы if с помощью некоторого LINQ. Вот общая идея:

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 голосов
/ 12 января 2010

Мне не ясно, что вы пытаетесь сделать. Это близко?

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