How do I properly use List-Vector3-.Contains()?

for some reason I seem to be getting different results with these two different code snippets. In both cases I’m searching a list of Vector3’s for a particular Vector3 VALUE.

In all the code below tempVertexList is defined as :

 List<Vector3> tempVertexList; 

This version uses List.Contains() (Which I though might be faster than “by hand”)

  //this version seem to fail to find matches

And, this version is “by hand”, which seems to find more matches:
//this version seem to find all matches properly
foreach (Vector3 listVector in tempVertexList)
if (listVector == meshVertices*)*
{ found = true; break; }
Why do these give different results? Does “Contains” use a different comparison operator? How can I fix that?

That’s because .Contains() ends up using Vector3.Equals() (via EqualityComparer<T>.Default since Vector3 doesn’t implement IEquatable), while manual comparison uses ==. Equals() literally compares the x/y/z, while == compares magnitudes.

Here’s (disassembled) Unity code for Vector3:

public override bool Equals(object other)
  if (!(other is Vector3))
    return false;
  Vector3 vector3 = (Vector3) other;
  if (this.x.Equals(vector3.x) && this.y.Equals(vector3.y))
    return this.z.Equals(vector3.z);
  return false;

public static bool operator ==(Vector3 lhs, Vector3 rhs)
  return (double) Vector3.SqrMagnitude(lhs - rhs) < 0.0 / 1.0;

You would need to implement your own EqualityComparer and pass it to the .NET collections during construction if you want to use things that do equality checks.