OR 运算符问题的可能 shorthand 解决方案
Possible shorthand solution for OR operator issue
我试图为 或 运算符提出 shorthand 解决方案。所以我想出了这样的东西,但结果总是错误的。
有人可以就如何解决此问题提供一些建议吗?这甚至会起作用吗?如果没有,有没有其他类似的解决方案?
P.S。我知道之前有人问过这个问题,但不幸的是,none 的解决方案满足了我的需要。
代码:
public static bool IsEqualsTo(object o, params object[] p)
{
for (int i = 0; i < p.Length; i++)
{
if (o == p[i])
{ return true; }
}
return false;
}
例如:
From if (MovementState == PMovementState.Walking || MovementState == PMovementState.Idle)
to if (IsEqualsTo(MovementState, PMovementState.Walking, PMovementState.Idle))
或
From if (input.text == "text" || input.text == "text2" || input.text == "text3")
to if (IsEqualsTo(input.text, "text", "text2", "text3"))
您可以使用 Contains 方法代替 for 循环:
public static bool IsEqualsTo(object o, params object[] p)
{
return p.Contains(o);
}
您可以使用通用版本来避免 boxing/unboxing:
public static bool IsEqualsTo<T>(T o, params T[] p)
{
var comparer = EqualityComparer<T>.Default; // make it an optional parameter
for (int i = 0; i < p.Length; i++)
{
if (comparer.Equals(o, p[i]))
return true;
}
return false;
}
您的问题的原因是,如果传递像 enum(struct) 这样的值类型,Object
参数会被装箱。这将导致 ==
到 return false
因为它不是同一个引用。如上所示使用 Equals
来解决此问题,并使用泛型来提高效率。
如前所述,您还可以使用 LINQ 缩短方法主体:
return p.Contains(o, comparer);
我试图为 或 运算符提出 shorthand 解决方案。所以我想出了这样的东西,但结果总是错误的。
有人可以就如何解决此问题提供一些建议吗?这甚至会起作用吗?如果没有,有没有其他类似的解决方案?
P.S。我知道之前有人问过这个问题,但不幸的是,none 的解决方案满足了我的需要。
代码:
public static bool IsEqualsTo(object o, params object[] p)
{
for (int i = 0; i < p.Length; i++)
{
if (o == p[i])
{ return true; }
}
return false;
}
例如:
From if (MovementState == PMovementState.Walking || MovementState == PMovementState.Idle)
to if (IsEqualsTo(MovementState, PMovementState.Walking, PMovementState.Idle))
或
From if (input.text == "text" || input.text == "text2" || input.text == "text3")
to if (IsEqualsTo(input.text, "text", "text2", "text3"))
您可以使用 Contains 方法代替 for 循环:
public static bool IsEqualsTo(object o, params object[] p)
{
return p.Contains(o);
}
您可以使用通用版本来避免 boxing/unboxing:
public static bool IsEqualsTo<T>(T o, params T[] p)
{
var comparer = EqualityComparer<T>.Default; // make it an optional parameter
for (int i = 0; i < p.Length; i++)
{
if (comparer.Equals(o, p[i]))
return true;
}
return false;
}
您的问题的原因是,如果传递像 enum(struct) 这样的值类型,Object
参数会被装箱。这将导致 ==
到 return false
因为它不是同一个引用。如上所示使用 Equals
来解决此问题,并使用泛型来提高效率。
如前所述,您还可以使用 LINQ 缩短方法主体:
return p.Contains(o, comparer);