c# - 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"))
解决方案
您可以使用通用版本来避免装箱/拆箱:
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);
推荐阅读
- javascript - java脚本中将数据类型从“string”转换为“int”的问题
- outlook-addin - 在未打开清单的情况下捕获 Outlook 事件?
- php - 有没有办法在 phpmyadmin 中解码字符串
- android - 无法使用“com.arthenica:mobile-ffmpeg-full:4.4”修剪视频
- php - 获取 joomla 页面加载时间
- javascript - Geojson 未显示在地图上
- python - 绘制然后擦除正方形
- multithreading - OpenBSD 是否支持并行内核访问
- android - 多模块 Android 项目代码覆盖率报告始终显示 0% 覆盖率
- javascript - 在异步递归函数中将文件作为回调写入