2012-03-19 2 views
2

Я пытаюсь понять, если объекты буксировки - записаны касанием Kinec или нет. Для этого я определяю виды форм (handArea) и (DangerArea). Для обнаружения столкновения я написал follwing код:Содержит() в визуальной студии не работает

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) не работает вообще.

Кто-нибудь знает почему?

+2

Это выглядит как C#, а не C++. Вы используете неправильный тег. – Eugene

+0

Я не слишком хорош с C#, но. Содержит в VB, как правило, для Strings, не уверен, что это то же самое на C#, а также, проверьте, «DangerArea»! = Nothing. – user959631

ответ

1

System.Collections.Generic.List<t>.Contains проверяет, имеется ли только этот список, в том числе элемент. Это практически никогда не произойдет на практике. Похоже, вы действительно хотите проверить области для пересечения или включения. (Вы можете сделать это с помощью простого запроса Linq)

0

Попробуйте .Any() с Linq, и вы можете использовать любое выражение, чтобы узнать, содержит ли он какой-либо объект с определенным свойством.

1

Вы должны реализовать IEquatable интерфейс и перегрузить метод Equals (T другой), поэтому компилятор теперь знает, какое поле следует сравнивать при использовании метода Contains().

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

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

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

примечание: заменить FIELDNAME с полем вы хотите сравнить по