Collections Data Structure C#

#region License
/*
 * 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.
 */
#endregion
#region Imports
using System;
using System.Collections;
using System.Reflection;
#endregion
namespace Spring.Util
{
    /// 
    /// Miscellaneous collection utility methods.
    /// 

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

    /// Mark Pollack (.NET)
    public sealed class CollectionUtils
    {
        /// 
        /// Returns the first element contained in both,  and .
        /// 

        /// The implementation assumes that  <<< 
        /// the source enumerable. may be null
        /// the list of candidates to match against  elements. may be null
        /// the first element found in both enumerables or null
        public static object FindFirstMatch(IEnumerable source, IEnumerable candidates)
        {
            if (IsEmpty(source) || IsEmpty(candidates))
            {
                return null;
            }
            IList candidateList = candidates as IList;
            if (candidateList == null)
            {
                if (candidates is ICollection)
                {
                    candidateList = new ArrayList((ICollection)candidates);
                }
                else
                {
                    candidateList = new ArrayList();
                    foreach (object el in candidates)
                    {
                        candidateList.Add(el);
                    }
                }
            }
            foreach (object sourceElement in source)
            {
                if (candidateList.Contains(sourceElement))
                {
                    return sourceElement;
                }
            }
            return null;
        }
        /// 
        /// Determines whether the specified collection is null or empty.
        /// 

        /// The collection to check.
        /// 
        ///   true if the specified collection is empty or null; otherwise, false.
        /// 

        public static bool IsEmpty(IEnumerable enumerable)
        {
            if (enumerable == null)
                return true;
            if (enumerable is ICollection)
            {
                return (0 == ((ICollection)enumerable).Count);
            }
            IEnumerator it = enumerable.GetEnumerator();
            if (!it.MoveNext())
            {
                return true;
            }
            return false;
        }
        /// 
        /// Determines whether the specified collection is null or empty.
        /// 

        /// The collection to check.
        /// 
        ///   true if the specified collection is empty or null; otherwise, false.
        /// 

        public static bool IsEmpty(ICollection collection)
        {
            return (collection == null || collection.Count == 0);
        }
        /// 
        /// Determines whether the specified dictionary is null empty.
        /// 

        /// The dictionary to check.
        /// 
        ///   true if the specified dictionary is empty or null; otherwise, false.
        /// 

        public static bool IsEmpty(IDictionary dictionary)
        {
            return (dictionary == null || dictionary.Count == 0);
        }
   }
}