Получение максимального значения enum через LINQ и только с учетом типа enum - PullRequest
0 голосов
/ 09 ноября 2018

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

У меня другой вопрос: мне нужно написать функцию GetMax, которая принимает в качестве параметра только Type перечисления, и мне нужно получить максимальное значение перечисления. Между тем, мое перечисление может происходить от long или int. Чтобы избежать переполнения, возвращаемое максимальное значение должно быть числовым long. Вот объявление функции:

long GetMax(Type type);

Я реализовал функцию, как показано ниже:

static private long GetMax(Type type)
{
    long maxValue = 0;
    if (Enum.GetValues(type).Length != 0)
    {
        maxValue = Int64.MinValue;
        foreach (var x in Enum.GetValues(type))
        {
            maxValue = Math.Max(maxValue, Convert.ToInt64(x));
        }
    }
    return maxValue;
}

Я думаю, что эта функция может быть реализована через LINQ для упрощения кода, но я не знаю, как это сделать. Я пробовал как:

long maxValue = Convert.ToInt64(Enum.GetValues(type).Cast<???>().ToList().Max());

Но я не знаю, что заполнять Cast <> , потому что я знаю только тип перечисления.

Есть ли решение для упрощения кода через LINQ? Thx!

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Просто поймите, что GetValues возвращает Array, поэтому .Select() недоступен, поэтому вам нужно .Cast<Enum>() до:

long maxValue = Enum.GetValues(type).Cast<Enum>().Select(x => Convert.ToInt64(x)).Max();

Также, если вам нужен фактическийenum value, вы можете использовать:

var maxValue = Enum.GetValues(type).Cast<Enum>().Max();
0 голосов
/ 09 ноября 2018

Я нашел метод, мы можем привести перечисление в object:

return Convert.ToInt64(Enum.GetValues(type).Cast<object>().Max());
0 голосов
/ 09 ноября 2018

Вы можете попробовать использовать универсальный метод.

static private T GetMax<T>(Type type)
{
    T maxValue = Enum.GetValues(type).Cast<T>().Max();
    return maxValue;
}

Тогда вам просто нужно передать ожидаемый тип данных.

GetMax<long>(typeof(Color))

c # online

...