12

Possible Duplicate:
How to enumerate an enum?

Suppose that i have an enumeration like that:

public enum Cars
{
    Audi = 0,
    BMW,
    Opel,
    Renault,
    Fiat,
    Citroen,
    AlfaRomeo,
}

Do i have a chance to iterate between Opel and Citroen? I want to give these values as parameters of a method.

2
  • var cars = Enum.GetValues(typeof (Cars)).Cast<int>().Where(i => i>=(int)Cars.Opel && i<=(int)Cars.Citroen).Cast<Cars>(); Commented May 8, 2012 at 13:29
  • Avoid using enums for this kind of enumerations. It introduces a maintenance nightmare if somebody inserts a value, for instance. And it seems rather plausible that your software will support other cars eventually. Commented May 8, 2012 at 13:35

3 Answers 3

13

This will work:

for(Cars car=Cars.Opel; car<=Cars.Citroen; car++)
{
  Console.WriteLine(car);
}

but you have to make sure that the start value is less than the end value.

EDIT
If you don't hardcode the start and end, but supply them as parameters, you need to use them in the correct order. If you just switch "Opel" and "Citroen", you will get no output.

Also (as remarked in the comments) the underlying integer values must not contain gaps or overlaps. Luckily if you do not specify values yourself (even the '=0' is not needed), this will be the default behaviour. See MSDN:

When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1.

Sign up to request clarification or add additional context in comments.

7 Comments

@NikhilAgrawal Yes it will. An enum value is an integer (by default) under the hood. I tested it (in LinqPad) and it worked fine.
This relies on your knowing the minimum and maximum of the Enum, and it also assumes that the enums form a contiguous range of integers. Downvote from me. It doesn't work if the range is not contiguous (think enum Foo { A = 1, B = 17 }).
@Jason - thanks for the explanation of the downvote (I was wondering). I know it depends on the ordering etc, that's the reason for that "start less than end" remark.
@Hans Kesting: It's not just the ordering. It's also that you're assuming the values form a contiguous sequence; they need not and this loops doesn't produce the correct values if they don't.
@Servy - if you don't define values for the enum-values, then by default they start at zero for the first defined value, and are "one more" for following values. See msdn.microsoft.com/en-us/library/cc138362.aspx, it is defined behaviour.
|
2

You can use the following code to loop trough an enum:

string[] names = Enum.GetNames(typeof(Cars));
Cars[] values = (MyEnum[])Enum.GetValues(typeof(Cars));

for( int i = 0; i < names.Length; i++ )
{
    print(names[i], values[i]);
}

If you know that you want to start at Opel and go to Citroen, you set the start and end values of i to the correct index in your array.

That would look something like this:

  string[] names = Enum.GetNames(typeof(Cars));
  Cars[] values = (Cars[])Enum.GetValues(typeof(Cars));

  int start = names.ToList().IndexOf("Opel");
  int end = names.ToList().IndexOf("Citroen") + 1;

  for (int i = start; i < end; i++)
  {
      Console.WriteLine(names[i] + ' ' + values[i]);
  }

2 Comments

If the enum defined the integer for each value then you could know this would work, but as is you're relying on undefined behaviors for the implementation of the enum. -1.
@Servy The question states that the first value is zero and by default the values are consecutive. Off course, if you change the default behavior this won't work, but the poster isn't doing that.
1

Also, using LINQ:

var values = (from e in Enum.GetValues(typeof(Cars)) as Cars[]
              where e >= Cars.Opel && e <= Cars.Citroen
              select e);
// the same as above, but using lambda expressions
// var values = (Enum.GetValues(typeof(Cars)) as Cars[]).Where(car => car >= Cars.Opel && car <= Cars.Citroen); 

foreach(Cars c in values) Console.WriteLine(c);

2 Comments

If the enum defined the integer for each value then you could know this would work, but as is you're relying on undefined behaviors for the implementation of the enum. -1.
IF the OP had asked for a generalized solution, I would agree with you. However, he did not, so I don't.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.