The following code prints a list of permissions, permission sets and security policies available on a given machine.
Code:
static void Main(string[] args)
{
IEnumerator ie = SecurityManager.PolicyHierarchy();
while(ie.MoveNext())
{
Console.WriteLine(((PolicyLevel)ie.Current).Label);
foreach (NamedPermissionSet nps in ((PolicyLevel)ie).NamedPermissionSets)
{
Console.WriteLine("\t"+nps.Name);
foreach (IPermission ip in nps)
{
Console.WriteLine("\t\t" + ip.GetType().Name);
}
}
}
Console.Read();
}
The following code does the same thing, but instead of bothering with the IEnumerator's MoveNext method and Current property I put the code inside an iterator block that yield returns the elements of the IEnumerator object and allows us to use a foreach loop.
Code:
static IEnumerable GetIEnumerable(IEnumerator ie)
{
while (ie.MoveNext()) yield return ie.Current;
}
static void Main(string[] args)
{
foreach(var ie in GetIEnumerable(SecurityManager.PolicyHierarchy()))
{
Console.WriteLine(((PolicyLevel)ie).Label);
foreach (NamedPermissionSet nps in ((PolicyLevel)ie).NamedPermissionSets)
{
Console.WriteLine("\t"+nps.Name);
foreach (IPermission ip in nps)
{
Console.WriteLine("\t\t" + ip.GetType().Name);
}
}
}
Console.Read();
}
The question is, which code is "better", and why?
(I like the first code better because it keeps all the work inside the Main method. But the second code is easier to read because it does all the iterations using foreach loops.)