Collections Data Structure C#

/*
 * Copyright  2002-2005 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
namespace Spring.Util.Generic
{
  /// 
  /// Miscellaneous generic collection utility methods.
  /// 

  /// 
  /// Mainly for internal use within the framework.
  /// 

  /// Mark Pollack (.NET)
  public sealed class CollectionUtils
  {
    /// 
    /// Determines whether the collection contains all the elements in the specified collection.
    /// 

    /// The collection to check.
    /// Collection whose elements would be checked for containment.
    /// true if the target collection contains all the elements of the specified collection.
    public static bool ContainsAll(ICollection targetCollection, ICollection sourceCollection)
    {
      if (targetCollection == null || sourceCollection == null)
      {
        throw new ArgumentNullException("Collection cannot be null.");
      }
      if ( sourceCollection.Count == 0 && targetCollection.Count > 1 )
        return true;
      IEnumerator sourceCollectionEnumerator = sourceCollection.GetEnumerator();
      bool contains = false;
      MethodInfo method;
      method = targetCollection.GetType().GetMethod("containsAll", BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public);
      if (method != null)
        contains = (bool) method.Invoke(targetCollection, new Object[] {sourceCollection});
      else
      {
        method = targetCollection.GetType().GetMethod("Contains", BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public);
        if (method == null)
        {
          throw new InvalidOperationException("Target collection does not implment a Contains() or ContainsAll() method.");
        }
        while (sourceCollectionEnumerator.MoveNext())
        {
          if ((contains = (bool) method.Invoke(targetCollection, new Object[] {sourceCollectionEnumerator.Current})) == false)
            break;
        }
      }
      return contains;
    }
    }
}