首页 > 解决方案 > OR 运算符问题的可能速记解决方案

问题描述

我试图为or运算符提出一个速记解决方案。所以我想出了这样的东西,但结果总是错误的。

有人可以就如何解决此问题提供一些建议吗?这甚至会起作用吗?如果没有,还有其他类似的解决方案吗?

PS我知道这个问题以前被问过,但不幸的是,没有一个解决方案适合我的需要。

编码:

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;
}

例如:

if (MovementState == PMovementState.Walking || MovementState == PMovementState.Idle)

if (IsEqualsTo(MovementState, PMovementState.Walking, PMovementState.Idle))

或者

if (input.text == "text" || input.text == "text2" || input.text == "text3")

if (IsEqualsTo(input.text, "text", "text2", "text3"))

标签: c#shorthandor-operator

解决方案


您可以使用通用版本来避免装箱/拆箱:

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;
}

您的问题的原因是,Object如果传递了像 enum(struct) 这样的值类型,则参数被装箱。这将导致==返回false,因为它不是同一个引用。使用Equals如上所示解决此问题并使用泛型使其更有效。

如前所述,您还可以使用 LINQ 缩短方法的主体:

return p.Contains(o, comparer);

推荐阅读