Проверьте, есть ли в массиве только разрешенные числа

У меня есть два типа:

public enum GroupTypes : int
{
        Downtime = 1,

        Uptime = 2,
}

И тогда у меня есть массив, например.

// first combo
int [] types = new Int32[] {1, 2};

//2nd
int [] types = new Int32[] {1};

//3rd
int [] types = new Int32[] {2};

Массив может иметь только 1, 2 или оба типа, и никакие другие не допускаются. Если пользователь вводит неправильный тип, он получает ошибку.

однако я изо всех сил пытаюсь это проверить. Вот как я это делаю:

// none types or more than two types added
if ((types == null || types.Length <= 0) || (types != null && types.Length > 1)) {
  return this.CreateApiError(ApiError.ApiErrors.BAD_REQUEST, "Incorrect types input", HttpStatusCode.BadRequest);
}

// contains non-existent type
if (!types.Where(a => a != 1 || a != 2).Select(x => true).FirstOrDefault()) {
  return this.CreateApiError(ApiError.ApiErrors.BAD_REQUEST, "Incorrect types input", HttpStatusCode.BadRequest);
}

первый if проверяет, подходит ли длина типов, а второй должен проверять, присутствуют ли только тип 1, тип 2 или оба, и он не содержит несуществующие типы, такие как 3, 11, ....

Я также пробовал types.Any(a => a == 1 || a == 2), но он просто проверяет, присутствует ли 1 или 2, и все равно говорит, что все в порядке, даже если у меня будет {1, 5}


c#
person user122222    schedule 18.12.2019    source источник
comment
Вы можете сделать types.Any(x => x != 1 && x != 2), который возвращает true, если какие-либо значения не равны 1 и 2.   -  person juharr    schedule 19.12.2019
comment
Почему бы не использовать массив вашего типа перечисления? Вместо int [] types = new Int32[] {1, 2}; используйте GroupTypes[] types = new GroupTypes[] {GroupTypes.Downtime, GroupTypes.Uptime};   -  person Chris Dunaway    schedule 19.12.2019


Ответы (3)


Ответ Джонатона Чейза работает, но это бесполезно, если по какой-либо причине вам нужно увеличить количество типов групп. Эта версия является более расширяемой.

if (types.Length == 0 || !types.All(x => Enum.IsDefined(typeof(GroupType), x)))
    return this.CreateApiError(ApiError.ApiErrors.BAD_REQUEST, "Incorrect types input", HttpStatusCode.BadRequest);
person howcheng    schedule 18.12.2019
comment
Этот подход также работает со строковыми представлениями флага enum. - person Jonathon Chase; 19.12.2019

Скорее всего, вы захотите использовать расширение All LINQ.

if(!types.All(a => a == 1 || a == 2))
    return this.CreateApiError(ApiError.ApiErrors.BAD_REQUEST, "Incorrect types input", HttpStatusCode.BadRequest);

Это вернет true, если все значения равны 1 или 2, и false, если какие-либо не совпадают.

Вы также можете сделать это, используя Any. Проблема с предикатом, который вы попробовали, заключается в том, что вы только проверяли, соответствует ли какое-либо значение одному из ваших ожидаемых значений. Вместо этого вы хотели бы проверить, что любое значение не соответствует одному из ваших ожидаемых значений. Следующее будет работать: types.Any(a => a != 1 && a != 2)

person Jonathon Chase    schedule 18.12.2019
comment
это работает, даже если присутствует только 1 или 2, но не оба? - person Joel Trauger; 19.12.2019
comment
@JoelTrauger Да. если список только [1] или [2], все элементы в нем будут 1 или 2. - person Jonathon Chase; 19.12.2019
comment
@JoelTrauger Да, потому что он проверяет каждый элемент, чтобы увидеть, является ли он 1 или 2, независимо от того, сколько элементов находится в types. Обратите внимание, что если types пусто, оператор if не срабатывает, поскольку All в пустой коллекции всегда равно true. - person juharr; 19.12.2019

Вы можете попробовать этот способ (ссылка на живую демонстрацию здесь)

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {

        var validTypes = new [] {1, 2};
        var invalidTypes = new [] {1, 2, 3};

        Console.WriteLine(validTypes.Any(p => !Enum.IsDefined(typeof(GroupTypes), p)));
        Console.WriteLine(invalidTypes.Any(p => !Enum.IsDefined(typeof(GroupTypes), p)));


    }

    public enum GroupTypes
    {
            Downtime = 1,
            Uptime = 2
    }
}
person Nguyễn Văn Phong    schedule 19.12.2019