THRIFT-1742 Optionally implement hashcode and equals in c#

Patch: Carl Yeksigian
diff --git a/lib/csharp/Makefile.am b/lib/csharp/Makefile.am
index 9b07f4f..f13f90a 100644
--- a/lib/csharp/Makefile.am
+++ b/lib/csharp/Makefile.am
@@ -19,6 +19,7 @@
 
 THRIFTCODE= \
             src/Collections/THashSet.cs \
+            src/Collections/TCollections.cs \
             src/Properties/AssemblyInfo.cs \
             src/Protocol/TAbstractBase.cs \
             src/Protocol/TBase.cs \
diff --git a/lib/csharp/src/Collections/TCollections.cs b/lib/csharp/src/Collections/TCollections.cs
new file mode 100644
index 0000000..23fd8da
--- /dev/null
+++ b/lib/csharp/src/Collections/TCollections.cs
@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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;
+
+namespace Thrift.Collections
+{
+	public class TCollections
+	{
+		/// <summary>
+		/// This will return true if the two collections are value-wise the same.
+		/// If the collection contains a collection, the collections will be compared using this method.
+		/// </summary>
+		public static bool Equals (IEnumerable first, IEnumerable second)
+		{
+			if (first == null && second == null)
+			{
+				return true;
+			}
+			if (first == null || second == null)
+			{
+				return false;
+			}
+			IEnumerator fiter = first.GetEnumerator ();
+			IEnumerator siter = second.GetEnumerator ();
+
+			bool fnext = fiter.MoveNext ();
+			bool snext = siter.MoveNext ();
+			while (fnext && snext)
+			{
+				IEnumerable fenum = fiter.Current as IEnumerable;
+				IEnumerable senum = siter.Current as IEnumerable;
+				if (fenum != null && senum != null)
+				{
+					if (!Equals(fenum, senum))
+					{
+						return false;
+					}
+				}
+				else if (fenum == null ^ senum == null)
+				{
+					return false;
+				}
+				else if (!Equals(fiter.Current, siter.Current))
+				{
+					return false;
+				}
+				fnext = fiter.MoveNext();
+				snext = siter.MoveNext();
+			}
+
+			return fnext == snext;
+		}
+
+		/// <summary>
+		/// This returns a hashcode based on the value of the enumerable.
+		/// </summary>
+		public static int GetHashCode (IEnumerable enumerable)
+		{
+			if (enumerable == null)
+			{
+				return 0;
+			}
+
+			int hashcode = 0;
+			foreach (Object obj in enumerable)
+			{
+				IEnumerable enum2 = obj as IEnumerable;
+				int objHash = enum2 == null ? obj.GetHashCode () : GetHashCode (enum2);
+				unchecked
+				{
+					hashcode = (hashcode * 397) ^ (objHash);
+				}
+			}
+			return hashcode;
+		}
+	}
+}
\ No newline at end of file
diff --git a/lib/csharp/src/Thrift.WP7.csproj b/lib/csharp/src/Thrift.WP7.csproj
index be38bc8..3d5b027 100644
--- a/lib/csharp/src/Thrift.WP7.csproj
+++ b/lib/csharp/src/Thrift.WP7.csproj
@@ -70,6 +70,7 @@
     <Reference Include="System.Net" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Collections\TCollections.cs" />
     <Compile Include="Collections\THashSet.cs" />
     <Compile Include="Properties\AssemblyInfo.WP7.cs" />
     <Compile Include="Protocol\TBase.cs" />
diff --git a/lib/csharp/src/Thrift.csproj b/lib/csharp/src/Thrift.csproj
index 0263d72..0722c18 100644
--- a/lib/csharp/src/Thrift.csproj
+++ b/lib/csharp/src/Thrift.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>

+<?xml version="1.0" encoding="utf-8"?>

 <!--

   Licensed to the Apache Software Foundation (ASF) under one

   or more contributor license agreements. See the NOTICE file

@@ -77,6 +77,7 @@
     <Reference Include="System.Web" />

   </ItemGroup>

   <ItemGroup>

+    <Compile Include="Collections\TCollections.cs" />

     <Compile Include="Collections\THashSet.cs" />

     <Compile Include="Properties\AssemblyInfo.cs" />

     <Compile Include="Protocol\TAbstractBase.cs" />

@@ -137,4 +138,4 @@
   <ProjectExtensions>

     <VisualStudio AllowExistingFolder="true" />

   </ProjectExtensions>

-</Project>
\ No newline at end of file
+</Project>