How do I exit a foreach loop in C#?

foreach (var name in parent.names)
{
if name.lastname == null)
{
Violated = true;
this.message = "lastname reqd";
}


if (!Violated)
{
Violated = !(name.firstname == null) ? false : true;
if (ruleViolated)
this.message = "firstname reqd";
}
}

Whenever violated is true, I want to get out of the foreach loop immediately. How do I do it?

304908 次浏览

Use break.


Unrelated to your question, I see in your code the line:

Violated = !(name.firstname == null) ? false : true;

In this line, you take a boolean value (name.firstname == null). Then, you apply the ! operator to it. Then, if the value is true, you set Violated to false; otherwise to true. So basically, Violated is set to the same value as the original expression (name.firstname == null). Why not use that, as in:

Violated = (name.firstname == null);

Use the break keyword.

Just use the statement:

break;

Look at this code, it can help you to get out of the loop fast!

foreach (var name in parent.names)
{
if (name.lastname == null)
{
Violated = true;
this.message = "lastname reqd";
break;
}
else if (name.firstname == null)
{
Violated = true;
this.message = "firstname reqd";
break;
}
}

During testing I found that foreach loop after break go to the loop beging and not out of the loop. So I changed foreach into for and break in this case work correctly- after break program flow goes out of the loop.

break; - to exit foreach

continue; - jump to next value

Instead of foreach loop

foreach (var name in parent.names)
{
if name.lastname == null)
{
Violated = true;
this.message = "lastname reqd";
}


if (!Violated)
{
Violated = !(name.firstname == null) ? false : true;
if (ruleViolated)
this.message = "firstname reqd";
}
}

make use of equivalent for loop

bool Violated = false;


for (int i = 0; i < parent.names.Count && !Violated; i++)
{
var name = parent.names[i];
    

if (name.lastname == null)
{
Violated = true;
this.message = "lastname reqd";
}


if (!Violated)
{
Violated = name.firstname == null;
if (ruleViolated)
this.message = "firstname reqd";
}
}

With the condition i < parent.names.Count && !Violated you get full control to stop the loop safe without any break or return or whatever to brutally force the foreach to stop.

Sidenotes

  • I changed Violated = !(name.firstname == null) ? false : true; to equivalent expression Violated = name.firstname == null;.
  • I guess ruleViolated is different to Violated.