Загрузка данных


using System;

namespace OperatorPractice
{
    public class Vector
    {
        public double X { get; set; }
        public double Y { get; set; }

        public Vector(double x, double y)
        {
            X = x;
            Y = y;
        }

        public override string ToString() => $"({X}, {Y})";

        // Бинарный +
        public static Vector operator +(Vector a, Vector b)
        {
            return new Vector(a.X + b.X, a.Y + b.Y);
        }

        // Бинарный -
        public static Vector operator -(Vector a, Vector b)
        {
            return new Vector(a.X - b.X, a.Y - b.Y);
        }

        // Умножение Vector * double
        public static Vector operator *(Vector a, double k)
        {
            return new Vector(a.X * k, a.Y * k);
        }

        // Умножение double * Vector
        public static Vector operator *(double k, Vector a)
        {
            return new Vector(a.X * k, a.Y * k);
        }

        // == и !=
        public static bool operator ==(Vector a, Vector b)
        {
            return a.X == b.X && a.Y == b.Y;
        }

        public static bool operator !=(Vector a, Vector b)
        {
            return !(a == b);
        }

        // Equals и GetHashCode
        public override bool Equals(object obj)
        {
            if (obj is Vector other)
                return this == other;
            return false;
        }

        public override int GetHashCode()
        {
            return HashCode.Combine(X, Y);
        }

        // Унарный -
        public static Vector operator -(Vector a)
        {
            return new Vector(-a.X, -a.Y);
        }

        // Явное преобразование в double (длина)
        public static explicit operator double(Vector v)
        {
            return Math.Sqrt(v.X * v.X + v.Y * v.Y);
        }

        // Вспомогательный метод Length
        public double Length()
        {
            return Math.Sqrt(X * X + Y * Y);
        }

        // Операторы < и >
        public static bool operator <(Vector a, Vector b)
        {
            return a.Length() < b.Length();
        }

        public static bool operator >(Vector a, Vector b)
        {
            return a.Length() > b.Length();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var v1 = new Vector(2, 3);
            var v2 = new Vector(4, 1);

            Console.WriteLine("v1 = " + v1);
            Console.WriteLine("v2 = " + v2);
            Console.WriteLine("v1 + v2 = " + (v1 + v2));
            Console.WriteLine("v1 - v2 = " + (v1 - v2));
            Console.WriteLine("v1 * 2 = " + (v1 * 2));
            Console.WriteLine("3 * v2 = " + (3 * v2));

            Console.WriteLine();
            Console.WriteLine(v1 + v2);   // Vector + Vector
            Console.WriteLine(v1 * 2);    // Vector * double
            Console.WriteLine(2 * v1);    // double * Vector

            Console.WriteLine();
            var v3 = new Vector(2, 3);
            var v4 = new Vector(2, 3);
            Console.WriteLine("v3 == v4: " + (v3 == v4)); // True
            Console.WriteLine("v3 != v4: " + (v3 != v4)); // False
            Console.WriteLine("v3.Equals(v4): " + v3.Equals(v4)); // True

            Console.WriteLine();
            Console.WriteLine("-v1 = " + (-v1)); // (-2, -3)

            Console.WriteLine();
            double length = (double)v1;
            Console.WriteLine("Длина v1: " + length); // 3.605551275463989

            Console.WriteLine();
            Console.WriteLine("v1 < v2: " + (v1 < v2)); // False
            Console.WriteLine("v1 > v2: " + (v1 > v2)); // True

            Console.ReadLine();
        }
    }
}