view Stocks/Stocks.Common/Models/Price.cs @ 114:e51a6af1c98d

working version
author adminsh@apollo
date Sat, 19 May 2012 16:53:34 +0100
parents e5d46bb6cdb0
children
line wrap: on
line source

using Stocks.Common.Core;
using System.Collections;
using System;
using System.Collections.Generic;

namespace Stocks.Common.Models
{
  public class Price : IEquatable<Price>, IComparable<Price>, IComparable
  {
    public string Symbol { get; set; }
    public decimal CurrentPrice { get; set; }
    public decimal PreviousPrice { get; set; }

    public Price()
    {
    }

    public Price(string symbol, decimal currentPrice, decimal previousPrice)
      : this()
    {
      Symbol = symbol;
      CurrentPrice = currentPrice;
      PreviousPrice = previousPrice;
    }

    public override bool Equals(object obj)
    {
      if (obj is Price)
        return Equals(obj as Price);
      else
        return false;
    }

    public bool Equals(Price other)
    {
      return (Symbol == other.Symbol
        && CurrentPrice == other.CurrentPrice
        && PreviousPrice == other.PreviousPrice);
    }

    public int CompareTo(Price other)
    {
      return Symbol.CompareTo(other.Symbol);
    }

    public int CompareTo(Price other, PriceComparisonType comparisonType)
    {
      switch (comparisonType)
      {
        case PriceComparisonType.NotSet:
        case PriceComparisonType.Symbol:
          return Symbol.CompareTo(other.Symbol);
        case PriceComparisonType.CurrentPrice:
          return CurrentPrice.CompareTo(other.CurrentPrice);
        case PriceComparisonType.PreviousPrice:
          return PreviousPrice.CompareTo(other.PreviousPrice);
        default:
          throw new Exception("Unknown comparison type");
      }
    }

    public int CompareTo(object obj)
    {
      Price other;
      if (obj is Price)
        other = obj as Price;
      else
        throw new ArgumentException("obj is not a Price");

      return CompareTo(other);
    }
    public override int GetHashCode()
    {
      int hash = 13;
      hash = (hash * 7) + Symbol.GetHashCode();
      hash = (hash * 7) + CurrentPrice.GetHashCode();
      hash = (hash * 7) + PreviousPrice.GetHashCode();
      return hash;
    }

    public static bool operator ==(Price lhs, Price rhs)
    {
      if (System.Object.ReferenceEquals(lhs, rhs))
        return true;

      if (((object)lhs == null) || ((object)rhs == null))
        return false;

      return lhs.Symbol == rhs.Symbol
        && lhs.CurrentPrice == rhs.CurrentPrice
        && lhs.PreviousPrice == rhs.PreviousPrice;
    }

    public static bool operator !=(Price lhs, Price rhs)
    {
      return !(lhs == rhs);
    }


    public class PriceComparer : IComparer<Price>, IComparer
    {
      public PriceComparisonType ComparisonMethod { get; set; }

      public int Compare(Price x, Price y)
      {
        return x.CompareTo(y, ComparisonMethod);
      }

      public int Compare(object x, object y)
      {
        Price lhs, rhs;

        if (x is Price)
          lhs = x as Price;
        else
          throw new ArgumentException("x is not a Price");

        if (y is Price)
          rhs = y as Price;
        else
          throw new ArgumentException("y is not a Price");

        return lhs.CompareTo(rhs, ComparisonMethod);
      }
    }
  }

  public enum PriceComparisonType { NotSet = 0, Symbol, CurrentPrice, PreviousPrice }
}