Collections Data Structure C#

//////////////////////////////////////////////////////////////////////
// Algorithmia is (c) 2010 Solutions Design. All rights reserved.
// http://www.sd.nl
//////////////////////////////////////////////////////////////////////
// COPYRIGHTS:
// Copyright (c) 2010 Solutions Design. All rights reserved.
// 
// The Algorithmia library sourcecode and its accompanying tools, tests and support code
// are released under the following license: (BSD2)
// ----------------------------------------------------------------------
// Redistribution and use in source and binary forms, with or without modification, 
// are permitted provided that the following conditions are met: 
//
// 1) Redistributions of source code must retain the above copyright notice, this list of 
//    conditions and the following disclaimer. 
// 2) Redistributions in binary form must reproduce the above copyright notice, this list of 
//    conditions and the following disclaimer in the documentation and/or other materials 
//    provided with the distribution. 
// 
// THIS SOFTWARE IS PROVIDED BY SOLUTIONS DESIGN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SOLUTIONS DESIGN OR CONTRIBUTORS BE LIABLE FOR 
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
//
// The views and conclusions contained in the software and documentation are those of the authors 
// and should not be interpreted as representing official policies, either expressed or implied, 
// of Solutions Design. 
//
//////////////////////////////////////////////////////////////////////
// Contributers to the code:
//    - Frans Bouma [FB]
//////////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
namespace SD.Tools.Algorithmia.UtilityClasses
{
  /// 
  /// General set of utility routines
  /// 

  public static class GeneralUtils
  {
    /// 
    /// Gets a usable comparison for the comparer passed in.
    /// 

    /// the type comparer works on
    /// The comparer.
    /// 
    /// usable comparison
    /// 

    public static Comparison GetUsableComparison(IComparer comparer)
    {
      IComparer comparerToUse = comparer;
      if(comparer == null)
      {
        comparerToUse = Comparer.Default;
      }
      return (a, b) => (comparerToUse.Compare(a, b));
    }
    /// 
    /// Compares the two values passed in and checks if they're value-wise the same. This extends 'Equals' in the sense that if the values are
    /// arrays it considers them the same if the values of the arrays are the same as well and the length is the same. 
    /// 

    /// It assumes the types of value1 and value2 are the same
    /// The first value to compare
    /// The second value to compare
    /// true if the values should be considered equal. If value1 or value2 are null and the other isn't, false is returned. If both are null,
    /// true is returned.

    public static bool ValuesAreEqual(object value1, object value2)
    {
      if(((value1 == null) && (value2 != null)) || ((value1 != null) && (value2 == null)))
      {
        return false;
      }
      if(value1 == null)    // test on value1, if value1 is null at this spot, value2 also has to be null, otherwise we'd have been caught by the previous expression.
      {
        return true;
      }
      // not null, proceed with checks on values.
      Type value1Type = value1.GetType();
      Type value2Type = value2.GetType();
      if(value1Type != value2Type)
      {
        return false;
      }
      if(value1Type.IsArray)
      {
        return CheckArraysAreEqual((Array)value1, (Array)value2);
      }
      return value1.Equals(value2);
    }
    
    /// 
    /// Performs a per-value compare on the arrays passed in and returns true if the arrays are of the same length and contain the same values.
    /// 

    /// 
    /// 
    /// true if the arrays contain the same values and are of the same length
    public static bool CheckArraysAreEqual(Array arr1, Array arr2)
    {
      if(((arr1 == null) && (arr2 != null)) || ((arr1 != null) && (arr2 == null)))
      {
        return false;
      }
      if(arr1 == null)  // test on arr1, if arr1 is null at this spot, arr2 also has to be null, otherwise we'd have been caught by the previous expression.
      {
        return true;
      }
      // non-null arrays.
      if(arr1.Length != arr2.Length)
      {
        return false;
      }
      bool areEqual = true;
      for(int i = 0; i < arr1.Length; i++)
      {
        areEqual &= arr1.GetValue(i).Equals(arr2.GetValue(i));
        if(!areEqual)
        {
          break;
        }
      }
      return areEqual;
    }
  }
}