构建与 MS SQL 构造 IN 等效的 C#?

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

在 MS SQL 中,我通常使用 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个回答
1
投票

这确实让代码变得混乱。

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

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.