Получение макс. значения перечисления

Мне удалось выяснить, как это сделать.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <time.h>

int int_pow(int n, int exp){
    int sum = n;
    for (int i = 1; i < exp; i++){
        sum = sum * n;
    }
    return sum;
}

int main()
{
    int random = 0;
    pid_t fpid;
    int p[2]; // 0 = read, 1 = write

    if (pipe(p) < 0){
        exit(1);
    }

    fpid = fork();

    if (fpid == 0){

        printf("\n(Child) Hello from child. \n");
        read(p[0], &random, sizeof(random));
        printf("(Child) Recieved from parent: %d \n", random);
        random = int_pow(random, 2);
        printf("(Child) Sent from child: %d \n", random);
        write(p[1], &random, sizeof(random));

        close(p[0]);//close child read.
        close(p[1]);//close child write.

        exit(0);
    } else {
        //wait(NULL);
        printf("(Parent) Hello from parent. \n");

        random = rand()%100+1;
        printf("(Parent) Sent from parent: %d \n", random);
        write(p[1], &random, sizeof(random));
        sleep(1);
        int wait = read(p[0], &random, sizeof(random));

        close(p[0]);//close parent read.
        close(p[1]);//close parent write.


        printf("(Parent) Recieved from Child: %d \n", random);
        exit(0);
    }
    return 0;
}
139
задан jdelator 15 October 2008 в 00:59
поделиться

8 ответов

Перечисление. GetValues (), кажется, возвращает значения в порядке, таким образом, можно сделать что-то вроде этого:

// given this enum:
public enum Foo
{
    Fizz = 3, 
    Bar = 1,
    Bang = 2
}

// this gets Fizz
var lastFoo = Enum.GetValues(typeof(Foo)).Cast<Foo>().Last();

Редактирование

Для не готовых прочитывать комментарии: можно также сделать это этот путь:

var lastFoo = Enum.GetValues(typeof(Foo)).Cast<Foo>().Max();

..., который будет работать, когда некоторые Ваши перечислимые значения будут отрицательны.

201
ответ дан 23 November 2019 в 23:20
поделиться

Это немного nitpicky, но фактическое максимальное значение любого перечисления является Int32. MaxValue (принимающий это - перечисление, полученное из интервала). Совершенно законно бросить любое значение Int32 к любому перечислению независимо от того, объявило ли это на самом деле участника с тем значением.

Законный:

enum SomeEnum
{
    Fizz = 42
}

public static void SomeFunc()
{
    SomeEnum e = (SomeEnum)5;
}
13
ответ дан 23 November 2019 в 23:20
поделиться

Я использовал следующее, когда мне требовались минуту и макс. значения моего перечисления. Я просто установил минуту, равную самому низкому значению перечисления и макс. равного самому высокому значению в перечислении как сами перечислимые значения.

public enum ChannelMessageTypes : byte
{
    Min                 = 0x80, // Or could be: Min = NoteOff
    NoteOff             = 0x80,
    NoteOn              = 0x90,
    PolyKeyPressure     = 0xA0,
    ControlChange       = 0xB0,
    ProgramChange       = 0xC0,
    ChannelAfterTouch   = 0xD0,
    PitchBend           = 0xE0,
    Max                 = 0xE0  // Or could be: Max = PitchBend
}

// I use it like this to check if a ... is a channel message.
if(... >= ChannelMessageTypes.Min || ... <= ChannelMessages.Max)
{
    Console.WriteLine("Channel message received!");
}
0
ответ дан 23 November 2019 в 23:20
поделиться

Согласно ответу Мэтта Гамильтона, я думал о создании для него метода расширения.

Начиная с ValueType не принимается в качестве ограничения параметра универсального типа, я не нашел лучшего способа ограничить T до Enum , но следующим образом.

Любые идеи будут очень оценил.

PS. пожалуйста, не обращайте внимания на мою имплицитность VB, я люблю использовать VB таким образом, в этом сила VB, и поэтому я люблю VB.

Howeva, вот она:

C #:

static void Main(string[] args)
{
    MyEnum x = GetMaxValue<MyEnum>();
}

public static TEnum GetMaxValue<TEnum>() 
    where TEnum : IComparable, IConvertible, IFormattable
    //In C#>=7.3 substitute with 'where TEnum : Enum', and remove the following check:
{
    Type type = typeof(TEnum);

    if (!type.IsSubclassOf(typeof(Enum)))
        throw new
            InvalidCastException
                ("Cannot cast '" + type.FullName + "' to System.Enum.");

    return (TEnum)Enum.ToObject(type, Enum.GetValues(type).Cast<int>().Last());
}

enum MyEnum
{
    ValueOne,
    ValueTwo
}

VB:

Public Function GetMaxValue _
    (Of TEnum As {IComparable, IConvertible, IFormattable})() As TEnum

    Dim type = GetType(TEnum)

    If Not type.IsSubclassOf(GetType([Enum])) Then _
        Throw New InvalidCastException _
            ("Cannot cast '" & type.FullName & "' to System.Enum.")

    Return [Enum].ToObject(type, [Enum].GetValues(type) _
                        .Cast(Of Integer).Last)
End Function
20
ответ дан 23 November 2019 в 23:20
поделиться

Существуют методы для получения информации о перечисляемых типах в System.Enum.

Итак, в проекте VB.Net в Visual Studio я могу набрать «System.Enum». и intellisense вызывает все виды добра.

В частности, одним из методов является System.Enum.GetValues ​​(), который возвращает массив перечисленных значений. Когда у вас есть массив, вы сможете делать все, что подходит для ваших конкретных обстоятельств.

В моем случае мои перечисляемые значения начинались с нуля и не пропускали никаких чисел, поэтому для получения максимального значения для моего перечисления я просто нужно знать, сколько элементов было в массиве.

Фрагменты кода VB.Net:

'''''''

Enum MattType
  zerothValue         = 0
  firstValue          = 1
  secondValue         = 2
  thirdValue          = 3
End Enum

'''''''

Dim iMax      As Integer

iMax = System.Enum.GetValues(GetType(MattType)).GetUpperBound(0)

MessageBox.Show(iMax.ToString, "Max MattType Enum Value")

'''''''
2
ответ дан 23 November 2019 в 23:20
поделиться

Используйте функцию Last, не удалось получить максимальное значение. Использовать функцию «макс» можно. Например:

 class Program
    {
        enum enum1 { one, two, second, third };
        enum enum2 { s1 = 10, s2 = 8, s3, s4 };
        enum enum3 { f1 = -1, f2 = 3, f3 = -3, f4 };

        static void Main(string[] args)
        {
            TestMaxEnumValue(typeof(enum1));
            TestMaxEnumValue(typeof(enum2));
            TestMaxEnumValue(typeof(enum3));
        }

        static void TestMaxEnumValue(Type enumType)
        {
            Enum.GetValues(enumType).Cast<Int32>().ToList().ForEach(item =>
                Console.WriteLine(item.ToString()));

            int maxValue = Enum.GetValues(enumType).Cast<int>().Max();     
            Console.WriteLine("The max value of {0} is {1}", enumType.Name, maxValue);
        }
    }
5
ответ дан 23 November 2019 в 23:20
поделиться

After tried another time, I got this extension method:

public static class EnumExtension
{
    public static int Max(this Enum enumType)
    {           
        return Enum.GetValues(enumType.GetType()).Cast<int>().Max();             
    }
}

class Program
{
    enum enum1 { one, two, second, third };
    enum enum2 { s1 = 10, s2 = 8, s3, s4 };
    enum enum3 { f1 = -1, f2 = 3, f3 = -3, f4 };

    static void Main(string[] args)
    {
        Console.WriteLine(enum1.one.Max());        
    }
}
9
ответ дан 23 November 2019 в 23:20
поделиться

В согласии с Мэтью Дж. Салливаном, для C #:

   Enum.GetValues(typeof(MyEnum)).GetUpperBound(0);

Я действительно не уверен, почему кто-то захочет использовать:

   Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Last();

... Дословно, семантически говоря, это не имеет большого смысла? (Всегда хорошо иметь разные способы, но я не вижу в последнем пользы.)

4
ответ дан 23 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: