构建 SQL Server 构造 IN 的 C# 等效项?

问题描述 投票:0回答:2

在 SQL Server 中,我经常使用

IN
来检查某个值是否在项目列表中,例如:

WHERE @x IN (1, 2, 3, 5, 8, 13)

我已经通过在库函数中定义以下内容来尽可能接近,因此:

public static bool IIN(object oValue, params object[] oValues)
{
    int i;

    for (i = 0; i <= oValues.GetUpperBound(0); i++)
    {
        if ((oValue.ToString()) == (oValues[i].ToString())) 
           return true;
    }

    return false;
}

我可以这样调用该函数:

bool bItemFound = IIN(x, 1, 2, 3, 5, 8, 13);

但是,因为它在图书馆中,所以我最终不得不引用该图书馆,因此:

bool bItemFound = MyProject.Common.Helpers.CoreHelper.IIN(x, 1, 2, 3, 5, 8, 13);

这确实让代码变得混乱。我尝试在调用类的顶部声明一个 lambda 函数:

Func<object, params object[], bool> IIN = (a, b) => { return MyProject.Common.Helpers.CoreHelper.IIN(a, b); };

但是 lambda 声明似乎不喜欢有参数数组。我可以将 b 参数设置为对象数组,因此:

public static bool IIN2(object oValue, object[] oValues)
{
    int i;

    for (i = 0; i <= oValues.GetUpperBound(0); i++)
        if ((oValue.ToString()) == (oValues[i].ToString())) 
           return true;

    return false;
}

我的 lambda 声明是:

Func <object, object[], bool> IIN = (a, b) => { return CoreHelper.IIN2(a, b); };

但是我必须在调用代码中声明一个内联一次性对象[]:

bool bItemFound = IIN(x, new object[] { 1, 2, 3, 5, 8, 13 });

有没有一种更简洁的方法来做到这一点,与 SQL 等价物一样干净、可读?

c# arraylist lambda
2个回答
2
投票

这确实让代码变得混乱。

如果唯一的目标是删除这部分:

MyProject.Common.Helpers.CoreHelper.

那么

using static
指令就可以做到这一点。 例如,如果您在文件顶部包含此指令:

using static MyProject.Common.Helpers.CoreHelper;

然后就可以直接调用该方法了:

bool bItemFound = IIN(x,1,2,3,5,8,13);

我还没有对此进行测试,但您可能甚至可以将其与 C# 10 中的

global using
指令结合起来:

global using static MyProject.Common.Helpers.CoreHelper;

这应该允许在项目中包含的整个文件中使用该方法。


0
投票

提出这个问题帮助我解决了这个问题。我想出的最好的办法是编写一个扩展类,因此:

public static class IntExtension
{
    public static bool IsIn(this int x, params int[] values)
    {
        for (int i = 0; i < values.GetUpperBound(0); i++)
            if (values[i] == x) return true;
        return false;
    }
}

这样我就可以称呼它为:

bool bItemFound = iMsgType.IsIn(1,2,3,5,8,13);

这对我来说已经足够好了。非常欢迎其他解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.