0 out of 1 rated this helpful - Rate this topic

Enum.GetValues Method

Updated: September 2011

Retrieves an array of the values of the constants in a specified enumeration.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)
[ComVisibleAttribute(true)]
public static Array GetValues(
	Type enumType
)

Parameters

enumType
Type: System.Type
The enumeration type to retrieve values from.

Return Value

Type: System.Array
An array that contains the values of the constants in enumType.
Exception Condition
ArgumentNullException

enumType is null.

ArgumentException

enumType is not an Enum.

The elements of the array are sorted by the binary values of the enumeration constants (that is, by their unsigned magnitude). The following example displays information about the array returned by the GetValues method for an enumeration that includes a negative, zero, and positive value.


using System;

enum SignMagnitude { Negative = -1, Zero = 0, Positive = 1 };

public class Example
{
   public static void Main()
   {
      foreach (var value in Enum.GetValues(typeof(SignMagnitude))) {
         Console.WriteLine("{0,3}     0x{0:X8}     {1}",
                           (int) value, ((SignMagnitude) value));
}   }
}
// The example displays the following output:
//         0     0x00000000     Zero
//         1     0x00000001     Positive
//        -1     0xFFFFFFFF     Negative


The GetValues method returns an array that contains a value for each member of the enumType enumeration. If multiple members have the same value, the returned array includes duplicate values. In this case, calling the GetName method with each value in the returned array does not restore the unique names assigned to members that have duplicate values. To retrieve all the names of enumeration members successfully, call the GetNames method.

The following example illustrates how to use GetValues.


using System;

public class GetValuesTest {
    enum Colors { Red, Green, Blue, Yellow };
    enum Styles { Plaid = 0, Striped = 23, Tartan = 65, Corduroy = 78 };

    public static void Main() {

        Console.WriteLine("The values of the Colors Enum are:");
        foreach(int i in Enum.GetValues(typeof(Colors)))
            Console.WriteLine(i);

        Console.WriteLine();

        Console.WriteLine("The values of the Styles Enum are:");
        foreach(int i in Enum.GetValues(typeof(Styles)))
            Console.WriteLine(i);
    }
}
// The example produces the following output:
//       The values of the Colors Enum are:
//       0
//       1
//       2
//       3
//       
//       The values of the Styles Enum are:
//       0
//       23
//       65
//       78


.NET Framework

Supported in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

Date

History

Reason

September 2011

Noted that returned array can include duplicate values.

Customer feedback.

August 2011

Added the Remarks section.

Content bug fix.

Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
Returned sort order is as UNSIGNED ordering
While I guess it does mention it, it dosesn't make it obvious unless you're really paying attention to it:
"The elements of the array are sorted by the binary values of the enumeration constants."

This little bug drove me insane for a bit until I realised what was going on. After a quick search I ran across this:
http://connect.microsoft.com/VisualStudio/feedback/details/98147/enum-getvalues

Posted by Microsoft on 10/05/2006 at 10:22
Hello,

Thank you for reporting this problem with System.Enum.GetValues(). Yes, this method indeed has a bug where it returns the array of enum values sorted as unsigned-types (-2 is 0xFFFFFFFE and -1 is 0xFFFFFFFF in two's complement, that's why they are showing up at the end of the list) instead of returning values sorted by their signed-types.

Unfortunately, we cannot change the sort order of GetValues because we will break all existing .NET programs that have been written to depend on the current sorting behavior – e.g. {0, 1, 2, 3, -3, -2, -1} instead of {-3, -2, -1, 0, 1, 2, 3}.

Thank you,
Josh Free
Base Class Libraries Development

Hopefully this will save some people out there a few headaches.

Alex.

---------------------

Here's a simple work around method for the problem above

        /// <summary>
        /// Gets the values sorted by signed value.
        /// </summary>
        /// <param name="enumType">Type of the enum.</param>
        /// <returns>An arry of enum values sorted by their signed value</returns>
        public static Array GetValuesSortedBySignedValue(Type enumType)
        {
            var retVal = Enum.GetValues(enumType);
            Array.Sort(retVal);
            return retVal;
        }

Although I don't understand why they can't have an overload that allows you to specify the sort order, the existing method could call this specifying unsigned and thus not break any existing apps.

Chris
Note for enums with duplicates
Please note that if your enum contains duplicates (i.e. if it has differently named constants pointing to the same integer value), then the array returned by this method will repeat that value. So a value with X different names will occur X times in the array returned by this method.