1 namespace ProCSharp
2 {
3 struct Vector : IEquatable<Vector> // For value type performance
4 {
5 public Vector(double x, double y, double z)
6 {
7 X = x;
8 Y = y;
9 Z = z;
10 }
11 public Vector(Vector v)
12 : this(v.X, v.Y, v.Z)
13 {
14 }
15
16 public double X { get; }
17 public double Y { get; }
18 public double Z { get; }
19 public override string ToString() => $"( {X}, {Y}, {Z} )";
20
21 public static Vector operator +(Vector left, Vector right)
22 => new Vector(left.X + right.X, left.Y + right.Y, left.Z + right.Z);
23
24 public static Vector operator *(double left, Vector right)
25 => new Vector(left * right.X, left * right.Y, left * right.Z);
26
27 public static Vector operator *(Vector left, double right)
28 => right * left;
29
30 public static double operator *(Vector left, Vector right)
31 => left.X * right.X + left.Y * right.Y + left.Z * right.Z;
32
33 // implement IEquatable<Vector> for value type
34 public bool Equals(Vector other)
35 {
36 if (object.ReferenceEquals(other, null))
37 return false;
38
39 if (object.ReferenceEquals(this, other))
40 return true;
41
42 return (this.X == other.X && this.Y == other.Y && this.Z == other.Z);
43 }
44
45 // implement override equals
46 public override bool Equals(object obj)
47 => Equals((Vector)obj);
48
49 public static bool operator ==(Vector left, Vector right)
50 => left.Equals(right);
51
52 public static bool operator !=(Vector left, Vector right)
53 => !left.Equals(right);
54
55 public override int GetHashCode()
56 => X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode();
57
58 public static void TestVector()
59 {
60 var vect1 = new Vector(3.0, 3.0, -10.0);
61 var vect2 = new Vector(3.0, 3.0, -10.0);
62 var vect3 = new Vector(2.0, 3.0, 6.0);
63 Console.WriteLine($"vect1 == vect2 returns {(vect1 == vect2)}");
64 Console.WriteLine($"vect1 == vect3 returns {(vect1 == vect3)}");
65 Console.WriteLine($"vect2 == vect3 returns {(vect2 == vect3)}");
66 Console.WriteLine();
67 Console.WriteLine($"vect1 != vect2 returns {(vect1 != vect2)}");
68 Console.WriteLine($"vect1 != vect3 returns {(vect1 != vect3)}");
69 Console.WriteLine($"vect2 != vect3 returns {(vect2 != vect3)}");
70 }
71 }
72 }