类似于.NET框架中的sql IN语句?

时间:2009-09-03 21:41:31

标签: c# .net language-features

我有这个功能:

    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 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:5)

不,我不相信,但你可以写一个像这样的扩展方法,它允许你的代码完全按照书面的方式工作。

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

虽然数组开销有点多。您可能希望为较小的固定数量的参数添加特殊情况。

答案 2 :(得分:3)

嗯,你可以这样做:

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));
}

答案 3 :(得分:2)

您可以采取以下措施:

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)) { ... }

我不会说他们是最有效的,但可能是的。

答案 4 :(得分:1)

我认为框架中没有任何内容,因此您必须编写自己的扩展方法。使用linq最接近的是:


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

答案 5 :(得分:0)

您可以使用.NET 3.5中的Contains扩展方法。它适用于所有可枚举的类型:

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

如果您想要的数字都在一个范围内,而不是“IN”功能,那么这将有效。但您可能会发现它很有用。

if (Enumerable.Range(10, 3).Contains(productTypeId))