Working through a tutorial (Professional ASP.NET MVC - Nerd Dinner), I came across this snippet of code:
public IEnumerable GetRuleViolation
Short version:
1: The yield is the magic "Stop and come back later" keyword, so the if statements in front of the "active" one have been evaluated.
2: yield break explicitly ends the enumeration (think "break" in a switch case)
3: Every time. You can cache the result, of course, by turning it into a List for example and iterating over that afterwards.