在 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 等价物一样干净、可读?
这确实让代码变得混乱。
如果唯一的目标是删除这部分:
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;
这应该允许在项目中包含的整个文件中使用该方法。
提出这个问题帮助我解决了这个问题。我想出的最好的办法是编写一个扩展类,因此:
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);
这对我来说已经足够好了。非常欢迎其他解决方案。