在 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 等价物一样干净、可读?
这确实让代码变得混乱。
如果唯一的目标是删除这部分:
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);
这对我来说已经足够好了。非常欢迎其他解决方案。