Что-то похожее на оператор SQL в IN.NET Framework?

У меня есть эта функция:

    public bool IsValidProduct(int productTypeId)
    {
        bool isValid = false;

        if (productTypeId == 10 ||
            productTypeId == 11 ||
            productTypeId == 12)
        {
            isValid = true;
        }

        return isValid;
    }

но мне интересно, есть ли более простой способ написать это, например:

    public bool IsValidProduct(int productTypeId)
    {
        bool isValid = false;

        if (productTypeId.In(10,11,12))
        {
            isValid = true;
        }

        return isValid;
    }

Я знаю, что мог бы написать метод расширения, чтобы справиться с этим, мне просто любопытно, есть ли уже что-то там или есть лучший способ написать это.

8 ответов

Решение

Нет, я не верю в это, но вы можете написать такой метод расширения, который позволит вашему коду работать точно так же, как написано.

public static bool In<T>(this T source, params T[] args) {
    return args.Contains(source);
}

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

new [] {10, 11, 12}.Contains(productTypeId)

Хм, вы могли бы сделать это:

public bool IsValidProduct(int productTypeId)
{
    bool isValid = false;

    if (new[] {10,11,12}.Contains(productTypeId))
    {
        isValid = true;
    }

    return isValid;
}

или если вы хотите то же самое, короче:

public bool IsValidProduct(int productTypeId)
{
    return (new[] {10,11,12}.Contains(productTypeId));
}

Вы могли бы сделать что-то вроде:

new int[] { 10,11,12 }.Contains(productTypeID);

или идите дальше, создайте расширение для int в соответствии с:

public static bool In(this int i, params int[] ints)
{
    return ints.Contains(i);
}

С использованием:

if (productTypeID.In(10,11,12)) { ... }

Я бы не сказал, что они самые эффективные, но возможно да.

Я не думаю, что есть что-то во фреймворке, поэтому вам придется написать свой собственный метод расширения. Самое близкое, что вы можете получить с linq, это что-то вроде:


if(new[] { 10, 11, 12 }.Contains(productTypeId)) { ... }

var validIds = new [] {10, 11, 12};
validIds.Contains (ProductID);

Вы можете использовать метод расширения Contains из.NET 3.5. Работает на всех перечисляемых типах:

if (new [] { 10, 11, 12 }.Contains(productTypeId))
{
    ...
}

Это сработало бы, если все нужные вам числа находятся в диапазоне, а не совсем в функции "IN", но вы можете найти это полезным.

if (Enumerable.Range(10, 3).Contains(productTypeId))
Другие вопросы по тегам