CollectionTool.cs
上传用户:husern
上传日期:2022-03-24
资源大小:534k
文件大小:8k
源码类别:

编辑器/阅读器

开发平台:

C#

  1. // -- FILE ------------------------------------------------------------------
  2. // name       : CollectionTool.cs
  3. // project    : Itenso Web User Forms
  4. // created    : Jani Giannoudis - 2008.10.30
  5. // language   : c#
  6. // environment: .NET 2.0
  7. // copyright  : (c) 2008 by Itenso GmbH, Switzerland
  8. // --------------------------------------------------------------------------
  9. using System;
  10. using System.Collections;
  11. using System.Globalization;
  12. using System.Reflection;
  13. using System.Text;
  14. namespace Itenso.WebUserForms.Data
  15. {
  16. // ------------------------------------------------------------------------
  17. /// <summary>
  18. /// Some utility methods for collections.
  19. /// </summary>
  20. /// <remarks>
  21. /// Just a container for some static methods which make life somewhat easier.
  22. /// </remarks>
  23. internal sealed class CollectionTool
  24. {
  25. // ----------------------------------------------------------------------
  26. public static bool HaveSameContents( IEnumerable left, IEnumerable right )
  27. {
  28. bool equal = left == right;
  29. if ( !equal )
  30. {
  31. if ( left != null && right != null )
  32. {
  33. IEnumerator otherItems = right.GetEnumerator();
  34. equal = true;
  35. foreach ( object item in left )
  36. {
  37. if ( otherItems.MoveNext() )
  38. {
  39. object otherItem = otherItems.Current;
  40. if ( item != otherItem && ( item == null || !item.Equals( otherItem ) ) )
  41. {
  42. equal = false;
  43. break;
  44. }
  45. }
  46. else
  47. {
  48. // the other enumeration has less objects
  49. equal = false;
  50. break;
  51. }
  52. }
  53. if ( equal && otherItems.MoveNext() )
  54. {
  55. // the other enumeration has more objects
  56. equal = false;
  57. }
  58. }
  59. }
  60. return equal;
  61. } // HaveSameContents
  62. // ----------------------------------------------------------------------
  63. public static bool AreEqual( IEnumerable enumerable, object obj )
  64. {
  65. bool equal = enumerable == obj;
  66. if ( !equal && enumerable != null && obj != null && enumerable.GetType() == obj.GetType() )
  67. {
  68. equal = HaveSameContents( enumerable, obj as IEnumerable );
  69. }
  70. return equal;
  71. } // AreEqual
  72. // ----------------------------------------------------------------------
  73. public static int AddHashCode( int hash, object obj )
  74. {
  75. int combinedHash = obj != null ? obj.GetHashCode() : 0;
  76. if ( hash != 0 ) // perform this check to prevent FxCop warning 'op could overflow'
  77. {
  78. combinedHash += hash * 31;
  79. }
  80. return combinedHash;
  81. } // AddHashCode
  82. // ----------------------------------------------------------------------
  83. public static int AddHashCode( int hash, int objHash )
  84. {
  85. int combinedHash = objHash;
  86. if ( hash != 0 ) // perform this check to prevent FxCop warning 'op could overflow'
  87. {
  88. combinedHash += hash * 31;
  89. }
  90. return combinedHash;
  91. } // AddHashCode
  92. // ----------------------------------------------------------------------
  93. public static int ComputeHashCode( IEnumerable enumerable )
  94. {
  95. int hash = 1;
  96. if ( enumerable == null )
  97. {
  98. throw new ArgumentNullException( "enumerable" );
  99. }
  100. foreach ( object item in enumerable )
  101. {
  102. hash = hash * 31 + ( item != null ? item.GetHashCode() : 0 );
  103. }
  104. return hash;
  105. } // ComputeHashCode
  106. // ----------------------------------------------------------------------
  107. public static string ToString( IEnumerable enumerable )
  108. {
  109. return ToString( enumerable, "[", "]", ",", "null" );
  110. } // ToString
  111. // ----------------------------------------------------------------------
  112. public static string ToString( IEnumerable enumerable, string delimiterText )
  113. {
  114. return ToString( enumerable, string.Empty, string.Empty, delimiterText, string.Empty );
  115. } // ToString
  116. // ----------------------------------------------------------------------
  117. /// <summary>
  118. /// conventiently concatenates the given items to a string for debugging purposes.
  119. /// </summary>
  120. /// <remarks>
  121. /// the whole collection is embraced with square brackets and the individual items
  122. /// are separated by a comma. null items will be displayed as 'null' instead of the
  123. /// empty string.
  124. /// </remarks>
  125. /// <param name="enumerable">the collection of items to print</param>
  126. /// <param name="startText">the starting text</param>
  127. /// <param name="endText">the ending textrint</param>
  128. /// <param name="delimiterText">the item delimiter text</param>
  129. /// <param name="undefinedValueText">text for undefined values</param>
  130. /// <returns>a concatenation of the string representations of all the items</returns>
  131. public static string ToString( IEnumerable enumerable, string startText, string endText, string delimiterText, string undefinedValueText )
  132. {
  133. if ( enumerable == null )
  134. {
  135. throw new ArgumentNullException( "enumerable" );
  136. }
  137. StringBuilder str = new StringBuilder( startText );
  138. bool first = true;
  139. foreach ( object obj in enumerable )
  140. {
  141. if ( obj == null && string.IsNullOrEmpty( undefinedValueText ) )
  142. {
  143. continue;
  144. }
  145. if ( first )
  146. {
  147. first = false;
  148. }
  149. else
  150. {
  151. str.Append( delimiterText );
  152. }
  153. if ( obj == null )
  154. {
  155. str.Append( undefinedValueText );
  156. }
  157. else if ( obj is DictionaryEntry )
  158. {
  159. DictionaryEntry mapEntry = (DictionaryEntry)obj;
  160. str.Append( mapEntry.Key.ToString() );
  161. str.Append( "=" );
  162. str.Append( mapEntry.Value == null ? undefinedValueText : mapEntry.Value.ToString() );
  163. }
  164. else
  165. {
  166. str.Append( obj.ToString() );
  167. }
  168. }
  169. str.Append( endText );
  170. return str.ToString();
  171. } // ToString
  172. // ----------------------------------------------------------------------
  173. public static string EnumValuesToString( Type enumType )
  174. {
  175. return EnumValuesToString( enumType, "[", "]", "|" );
  176. } // EnumValuesToString
  177. // ----------------------------------------------------------------------
  178. public static string EnumValuesToString( Type enumType, string delimiterText )
  179. {
  180. return EnumValuesToString( enumType, string.Empty, string.Empty, delimiterText );
  181. } // EnumValuesToString
  182. // ----------------------------------------------------------------------
  183. public static string EnumValuesToString( Type enumType, string startText, string endText, string delimiterText )
  184. {
  185. if ( enumType == null )
  186. {
  187. throw new ArgumentNullException( "enumType" );
  188. }
  189. StringBuilder str = new StringBuilder( startText );
  190. FieldInfo[] fields = enumType.GetFields( BindingFlags.Public | BindingFlags.Static );
  191. for ( int i = 0; i < fields.Length; i++ )
  192. {
  193. if ( i > 0 )
  194. {
  195. str.Append( delimiterText );
  196. }
  197. str.Append( fields[ i ].Name );
  198. }
  199. str.Append( endText );
  200. return str.ToString();
  201. } // EnumValuesToString
  202. // ----------------------------------------------------------------------
  203. public static int ParseEnumValue( Type enumType, string value, bool ignoreCase )
  204. {
  205. if ( enumType == null )
  206. {
  207. throw new ArgumentNullException( "enumType" );
  208. }
  209. try
  210. {
  211. return (int)Enum.Parse( enumType, value, ignoreCase );
  212. }
  213. catch ( ArgumentException )
  214. {
  215. try
  216. {
  217. throw new ArgumentException( string.Format(
  218. "'{0}' is not a valid value for {1}. must be one of {2}.",
  219. value, 
  220. enumType.Name,
  221. EnumValuesToString( enumType ) ) );
  222. }
  223. catch ( FormatException )
  224. {
  225. // EXC: ignore, should not happen with a coded format string
  226. return 0;
  227. }
  228. }
  229. } // ParseEnumValue
  230. // ----------------------------------------------------------------------
  231. /// <summary>
  232. /// prevent instantiation of class utility.
  233. /// </summary>
  234. private CollectionTool()
  235. {
  236. } // CollectionTool
  237. } // class CollectionTool
  238. } // namespace Itenso.WebUserForms.Data
  239. // -- EOF -------------------------------------------------------------------