visual studio中的Contains()不起作用
本文关键字:不起作用 Contains studio 中的 visual | 更新日期: 2023-09-27 18:28:19
我试着判断Kinec录制的两个对象是否接触。为此,我定义了各种形状(handArea)和(DangerArea)。对于碰撞检测,我编写了以下代码:
private bool checkAreaViolation(List<MCvBox2D> DangerAreas, List<MCvBox2D> HandAreas)
{
int zaehler;
int ZaehlerDA;
int Test;
String TestS;
Test = 0;
ZaehlerDA= 0;
foreach (MCvBox2D DangerBox in DangerAreas)
{
zaehler = 0;
ZaehlerDA++;
foreach (MCvBox2D HandBox in HandAreas)
{
if(zaehler<=HandAreas.Count-1)
if (DangerAreas.Contains(HandAreas[zaehler])==true)
return true;
PointF[] handVertices = HandBox.GetVertices();
for (int i = 0; i < handVertices.Length; i++)
{
if (PointInPolygon(handVertices[i], DangerBox.GetVertices()))
{
return true;
}
zaehler++;
}
}
}
return false;
}
不幸的是,if (DangerAreas.Contains(HandAreas[zaehler])==true)
根本不起作用。
有人知道为什么吗?
System.Collections.Generic.List<t>.Contains
检查列表是否且仅当包含精确元素。这在实践中几乎永远不会发生。看起来你真的想检查这些区域的交叉点或包含点。(您可以通过一个简单的Linq查询来完成此操作)
您应该实现IEquatable接口并重载Equals(T other)方法,所以现在编译器知道在执行Contains()方法时必须比较哪个字段。
public class MCvBox2D:IEquatable<MCvBox2D>
{
..............
private override bool Equals(MCvBox2D other)
{
if(this.fieldName==other.fieldName)
return true;
}
..............
}
注意:将fieldName替换为要由进行比较的字段
使用Linq尝试.Any()
,您可以使用任何表达式来确定它是否包含具有特定属性的对象。