Visual Studio中的Contains()不起作用

时间:2012-03-19 15:10:26

标签: c# emgucv

我试图喜欢用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)根本不起作用。

有人知道为什么吗?

3 个答案:

答案 0 :(得分:1)

System.Collections.Generic.List<t>.Contains检查是否且仅当列表包含完全元素时。这几乎不会在实践中发生。看起来你真的想要检查交叉点或包含的区域。 (您可以使用简单的Linq查询执行此操作)

答案 1 :(得分:1)

你应该实现IEquatable接口并重载Equals(T other)方法,所以现在编译器知道在执行Contains()方法时必须比较哪个字段。

public class MCvBox2D:IEquatable<MCvBox2D>
    {
    ..............

    private override bool Equals(MCvBox2D other)
    {
       if(this.fieldName==other.fieldName)
          return true;
    }

    ..............
    }

注意:将fieldName替换为您希望通过

进行比较的字段

答案 2 :(得分:0)

使用Linq尝试.Any(),您可以使用任何表达式来确定它是否包含某些具有特定属性的对象。