Vector extends List : List « Data Structure « C# / CSharp Tutorial






using System;
using System.Collections.Generic;
using System.Text;

public static class VectorDelegates {
    public static int Compare(Vector x, Vector y) {
        if (x.R > y.R) {
            return 1;
        } else if (x.R < y.R) {
            return -1;
        }
        return 0;
    }

    public static bool TopRightQuadrant(Vector target) {
        if (target.Theta >= 0.0 && target.Theta <= 90.0) {
            return true;
        } else {
            return false;
        }
    }
}

public class Vectors : List<Vector> {
    public Vectors() {
    }

    public Vectors(IEnumerable<Vector> initialItems) {
        foreach (Vector vector in initialItems) {
            Add(vector);
        }
    }

    public string Sum() {
        StringBuilder sb = new StringBuilder();
        Vector currentPoint = new Vector(0.0, 0.0);
        sb.Append("origin");
        foreach (Vector vector in this) {
            sb.AppendFormat(" + {0}", vector);
            currentPoint += vector;
        }
        sb.AppendFormat(" = {0}", currentPoint);
        return sb.ToString();
    }
}

public class Vector {
    public double? R = null;
    public double? Theta = null;

    public double? ThetaRadians {
        get {
            return (Theta * Math.PI / 180.0);
        }
    }

    public Vector(double? r, double? theta) {
        if (r < 0) {
            r = -r;
            theta += 180;
        }
        theta = theta % 360;
        R = r;
        Theta = theta;
    }

    public static Vector operator +(Vector op1, Vector op2) {
        try {
            double newX = op1.R.Value * Math.Sin(op1.ThetaRadians.Value)
               + op2.R.Value * Math.Sin(op2.ThetaRadians.Value);
            double newY = op1.R.Value * Math.Cos(op1.ThetaRadians.Value)
               + op2.R.Value * Math.Cos(op2.ThetaRadians.Value);

            double newR = Math.Sqrt(newX * newX + newY * newY);
            double newTheta = Math.Atan2(newX, newY) * 180.0 / Math.PI;

            return new Vector(newR, newTheta);
        } catch {
            return new Vector(null, null);
        }
    }

    public static Vector operator -(Vector op1) {
        return new Vector(-op1.R, op1.Theta);
    }

    public static Vector operator -(Vector op1, Vector op2) {
        return op1 + (-op2);
    }

    public override string ToString() {
        string rString = R.HasValue ? R.ToString() : "null";
        string thetaString = Theta.HasValue ? Theta.ToString() : "null";

        return string.Format("({0}, {1})", rString, thetaString);
    }
}

class Program {
    static void Main(string[] args) {
        Vectors route = new Vectors();
        route.Add(new Vector(2.0, 90.0));
        route.Add(new Vector(1.0, 180.0));
        route.Add(new Vector(0.5, 45.0));
        route.Add(new Vector(2.5, 315.0));

        Console.WriteLine(route.Sum());

        Comparison<Vector> sorter = new Comparison<Vector>(VectorDelegates.Compare);
        route.Sort(sorter);
        Console.WriteLine(route.Sum());

        Predicate<Vector> searcher = new Predicate<Vector>(VectorDelegates.TopRightQuadrant);
        Vectors topRightQuadrantRoute = new Vectors(route.FindAll(searcher));
        Console.WriteLine(topRightQuadrantRoute.Sum());
    }
}








11.34.List
11.34.1.Obtaining a read-only copy of a list
11.34.2.Using the Action delegate
11.34.3.Converting a list from list of string to list of int
11.34.4.Converting a list: user defined converting function
11.34.5.Vector extends List
11.34.6.List Filtering With Linq
11.34.7.List Joining Ordering And Filtering With Linq
11.34.8.List Order With Extension Method
11.34.9.List Query With Delegates
11.34.10.List Query With Delegates Compact
11.34.11.List Query With Lambda Expression
11.34.12.List Sort With Comparer
11.34.13.List Sort With Comparison Delegate
11.34.14.Implement IComparable to use List.Sort
11.34.15.List.ForEach
11.34.16.Compact Code for looping through the List with delegate
11.34.17.List Convert All
11.34.18.Using external method to pass into Find method
11.34.19.List size and capacity
11.34.20.List range operation
11.34.21.Use Action<(Of <(T>)>) delegate to print the contents of a List<(Of <(T>)>) object.
11.34.22.Item property (the indexer in C#) and various other properties and methods of the List<(Of <(T>)>) generic class.