ChangeLog 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. 2007-03-27 Alan McGovern <[email protected]>
  2. * List.cs: Optimized several methods to increase performance
  3. 2007-03-21 Juraj Skripsky <[email protected]>
  4. * List.cs (FindAllStackBits): Small optimization to the new code.
  5. Built resulting List<T> directly as an array, wrap it in a List<T>
  6. afterwards. Stop the filling of the result array as soon as all
  7. matching items have been processed.
  8. 2007-03-20 Juan Cristóbal Olivares <[email protected]>
  9. * List.cs (FindAll): Optimize FindAll using a bitmask to determine
  10. the number of positive matches, this increases the performance in
  11. all cases below 10,000,000 elements extensively:
  12. 100 elements:
  13. old method: 00:00:00.0126610 (26x)
  14. stackalloc bit method: 00:00:00.0004750 (1x)
  15. array bit method: 00:00:00.0010700 (2x)
  16. heap bit method: 00:00:00.0038830 (8x)
  17. 1,000 elements:
  18. old method: 00:00:00.0139250 (24x)
  19. stackalloc bit method: 00:00:00.0005670 (1x)
  20. array bit method: 00:00:00.0010890 (2x)
  21. heap bit method: 00:00:00.0034920 (6x)
  22. 10,000 elements:
  23. old method: 00:00:00.0136110 (12x)
  24. stackalloc bit method: 00:00:00.0011240 (1x)
  25. array bit method: 00:00:00.0016450 (1.4x)
  26. heap bit method: 00:00:00.0043110 (3x)
  27. 50,000 elements:
  28. old method: 00:00:00.0175970 (3x)
  29. stackalloc bit method: 00:00:00.0085630 (1.5x)
  30. array bit method: 00:00:00.0055010 (1x)
  31. heap bit method: 00:00:00.0099590 (1.8x)
  32. 100,000 elements:
  33. old method: 00:00:00.0210330 (2x)
  34. array bit method: 00:00:00.0100430 (1x)
  35. heap bit method: 00:00:00.0154150 (1.5x)
  36. 1,000,000 elements:
  37. old method: 00:00:00.1243730 (1.2x)
  38. array bit method: 00:00:00.0973110 (1x)
  39. heap bit method: 00:00:00.1285650 (1.3x)
  40. 10,000,000 elements:
  41. old method: 00:00:00.9252570 (1x)
  42. array bit method: 00:00:00.9632300 ( 1.05x)
  43. heap bit method: 00:00:01.1098490 (1.20x)
  44. 2007-03-08 David Mitchell <[email protected]>
  45. * List.cs: Fix the case where List.set_Item(int index) throws
  46. inappropriate exception when index is equal to List.Count
  47. List.IndexOf(object item) and IList.Contains(object item) throw
  48. exceptions when given invalid types.
  49. IList.Add(object item) throws InvalidCastException when item is
  50. not of the correct type.
  51. 2007-03-08 Gert Driesen <[email protected]>
  52. * Comparer.cs: Renamed IComparableOfTComparer<T> to GenericComparer<T>
  53. to fix binary serialization compatibility with MS.
  54. 2007-03-05 David Mitchell <[email protected]>
  55. * Dictionary.cs: An instance of Dictionary<TKey,TValue> is
  56. supposed to throw a KeyNotFoundException when
  57. the user attempts to retrieve the value associated with a key that
  58. is not in the dictionary.
  59. On the other hand, an instance of IDictionary is supposed to
  60. return null in similar circumstances.
  61. 2007-03-05 David Mitchell <[email protected]>
  62. * List.cs: Fix InsertRange bug (80930).
  63. 2006-09-15 Gert Driesen <[email protected]>
  64. * List.cs: Fixed binary serialization compatibility with MS.NET.
  65. Increment version whenever _items is modified; this fixes version
  66. checks in Enumerator.
  67. 2006-09-06 Zoltan Varga <[email protected]>
  68. * Dictionary.cs: Speed up get_Item/set_Item/GetPrev () a bit. Increase capacity
  69. specified by the user so 'capacity' elements can really be added without resizing.
  70. 2006-07-12 Zoltan Varga <[email protected]>
  71. * Dictionary.cs: Swap order of parameters to cmp.Equals () to improve
  72. compatibility with MS.NET and strange Equals () implementations.
  73. 2006-05-17 Kazuki Oikawa <[email protected]>
  74. * List.cs : implemented Sort(Comparison <T>).
  75. 2006-05-08 Atsushi Enomoto <[email protected]>
  76. * List.cs : use proper comparer in Contains(), IndexOf() and
  77. LastIndexOf(). Patch by Kazuki Oikawa. Fixed bug #77277.
  78. 2006-03-16 Ankit Jain <[email protected]>
  79. * List.cs (CheckIndex): Check for -ve indices and allow index == size.
  80. (Insert): Use CheckIndex.
  81. 2006-03-12 Zoltan Varga <[email protected]>
  82. * List.cs: Applied patch from <[email protected]>. Fixes #77504.
  83. 2006-02-10 Martin Baulig <[email protected]>
  84. * Comparer.cs
  85. (IComparableOfTComparer): `T' must implement `IComparable<T>' and
  86. not `IComparable'.
  87. Tue Jan 24 18:22:54 CET 2006 Paolo Molaro <[email protected]>
  88. * Dictionary.cs: avoid long reminder operations.
  89. 2006-01-23 Raja R Harinath <[email protected]>
  90. Speed up remove. Use 'dict[k]=v' as a self-tuning hint.
  91. * Dictionary.cs (GetSlot): Move data-structure traversal to ...
  92. (GetPrev): ... this. Returns the slot prior to the place we're
  93. looking for, or null if that place is the head of the chain.
  94. (Remove): Use it.
  95. (this.set): Use it. Implement move-to-front on set.
  96. * Dictionary.cs (ToTKey, ToTValue): New helpers to convert from
  97. type 'object'.
  98. (IDictionary.this, IDictionary.Add): Use them.
  99. (IDictionary.Contains, IDictionary.Remove): If the types don't
  100. match, do nothing.
  101. 2006-01-19 Raja R Harinath <[email protected]>
  102. Fix to pass new nunit tests.
  103. * Dictionary.cs (ShimEnumerator): New class. Implement the
  104. requirement that ((IDictionary) foo).GetEnumerator ().Current has
  105. type DictionaryEntry.
  106. (IDictionary.GetEnumerator): Use ShimEnumerator.
  107. (Enumerator.Current): Now has type KeyValuePair<TKey, TValue>.
  108. (Enumerator.MoveNext): Use VerifyState.
  109. (Enumerator.VerifyState): Move validation of 'current' field to ...
  110. (Enumerator.CurrentSlot): ... this.
  111. (Enumerator.Current, Enumerator.IDictionaryEnumerator.Entry):
  112. Use CurrentSlot.
  113. (CopyTo, ICollection.CopyTo): Use subtle reasoning to replace a
  114. '>=' with a '>'. Don't throw an ArgumentException when
  115. index==array.Length && Count==0.
  116. (KeyCollection.CopyTo, ValueCollection.CopyTo): Likewise, and thus
  117. obviate the need to check (dictionary.Count == 0).
  118. 2005-12-20 Sebastien Pouliot <[email protected]>
  119. * List.cs: Applied Atsushi's patch for Sort (bug 76361) now that the
  120. generic versions of Array.Sort are implemented.
  121. 2005-12-19 Sebastien Pouliot <[email protected]>
  122. * Dictionary.cs: Added [Serializable] attribute to both inner
  123. Enumerator struct in Key and Value inner collection classes.
  124. * EqualityComparer.cs: Added missing IEqualityComparer interface.
  125. * List.cs: Added [Serializable] attribute to both inner Enumerator
  126. struct.
  127. 2005-12-19 Sebastien Pouliot <[email protected]>
  128. * Dictionary.cs: Fixed ICollection.CopyTo to use DictionaryEntry. Fixed
  129. Key and Value CopyTo not to throw exception if the dictionary is empty
  130. (fix bug #77019).
  131. * List.cs: Fix exception reporting to match MS behaviour (2.0 final).
  132. 2005-11-19 Zoltan Varga <[email protected]>
  133. * KeyNotFoundException.cs: Add default message.
  134. 2005-09-18 Miguel de Icaza <[email protected]>
  135. * Dictionary.cs: Change style for internal fields.
  136. If the capacity is zero, set the capacity to our default size as 0
  137. is an allowed parameter in .NET
  138. 2005-08-10 Kamil Skalski <[email protected]>
  139. * KeyValuePair.cs, Dictionary.cs: Change Key and Value to properties to match
  140. .NET 2.0 July CTP. Update its use in Dictionary, since now we
  141. cannot write to them.
  142. 2005-07-10 Kamil Skalski <[email protected]>
  143. * Comparer.cs, EqualityComparer.cs: Use MakeGenericType instead of BindGenericParameters.
  144. 2005-06-27 Raja R Harinath <[email protected]>
  145. Introduce some thread-safety by removing the modify-on-read
  146. move-to-front heuristic.
  147. * Dictionary.cs (_enumeratorGeneration, _enumerators): Remove.
  148. (Count): Add internal property set. Invalidate enumerators when
  149. Count is changed. Change all references of _usedSlots to Count.
  150. (this): Invalidate enumerators when the value of some slot is
  151. changed, even if the layout of the data-structure isn't modified.
  152. (DoHash): Remove null-key check. All codepaths leading to this
  153. function already have the check.
  154. (GetSlot): Remove move-to-front heuristic.
  155. (Remove): Update.
  156. 2005-06-24 Martin Baulig <[email protected]>
  157. * IDictionary.cs: Use the same type parameter names than on MS.
  158. * IDictionary.cs, Dictionary.cs: We don't need the `CLSCompliant'
  159. attribute here.
  160. 2005-06-23 Martin Baulig <[email protected]>
  161. * *.cs: Removed the `[ComVisible(false)]' attributes everywhere.
  162. 2005-06-22 Raja R Harinath <[email protected]>
  163. * Dictionary.cs (_generation, _enumeratorGeneration, _enumerators):
  164. New fields to implement fail-fast semantics. All code that
  165. modifies the table increment _generation.
  166. (GetSlot): Use _hcp to compare keys. Return the slot containing
  167. the key, rather than the index. Avoid move-to-front heuristic
  168. when there's an enumerator coursing through the table.
  169. (this, Add, TryGetValue, ContainsKey, Remove): Update to change.
  170. (Enumerator.Enumerator): Save the generation of the dictionary.
  171. (Enumerator.Dispose): Inform dictionary that the enumerator is no more.
  172. (Enumerator.MoveNext, Enumerator.VerifyState): Fail if the
  173. dictionary has been modified.
  174. 2005-06-20 David waite <[email protected]>
  175. * List.cs : substantial changes and optimizations
  176. (AddCollection, AddEnumerable): new internal specializations of AddRange
  177. (AsReadOnly): returns specific IList<T> to match ms.net 2.0b2 api.
  178. (Clear): reset size to zero on clear
  179. (ConvertAll): catch null converter, use Add to prevent OutOfBounds
  180. exception
  181. (FindAll, FindIndex, FindLast, FindLastIndex, RemoveAll, TrueForAll):
  182. check for null match
  183. (FindLastIndex): correct index parameters based on ms.net 2005b2 behavior
  184. (ForEach): catch null action
  185. (CheckIndex): new internal function similar to CheckRange for functions
  186. which only provide a starting index
  187. (InsertCollection, InsertEnumerable): new internal specializations of
  188. InsertRange
  189. (ReadOnlyList): removed, ReadOnlyCollection in
  190. System.Collections.ObjectModel is used instead now
  191. 2005-06-16 David Waite <[email protected]>
  192. * Dictionary.cs (EnumerationMode): Remove.
  193. (Enumerator): Remove return type flag - legacy return is expected to
  194. always return a DictionaryEntry
  195. (Enumerator): Make constructor internal, it is not public on ms.net
  196. beta 2
  197. (VerifyState): Added method to check state preconditions and throw
  198. appropriate exceptions.
  199. (KeyCollection,ValueCollection): Mark sealed to match ms.net beta 2
  200. (KeyCollection.Enumerator._hostEnumerator): make exact struct type,
  201. rather than boxing and using by interface
  202. (KeyCollection.Enumerator.Dispose): Call _hostEnumerator.Dispose.
  203. (ValueCollection.Enumerator._hostEnumerator): make exact struct type,
  204. rather than boxing and using by interface
  205. (ValueCollection.Enumerator.Dispose): Call _hostEnumerator.Dispose.
  206. * EqualityComparer.cs (DefaultComparer, IEquatableOfTEqualityComparer):
  207. Mark as serializable.
  208. 2005-06-16 Raja R Harinath <[email protected]>
  209. * Dictionary.cs (GetKeys, GetValues): Remove.
  210. (SetThreshold): New function to calculate the resize threshold.
  211. (CopyTo): Don't use foreach syntax.
  212. (ContainsValue): Likewise. Use default equality comparer of the
  213. value type.
  214. (GetObjectData): Use CopyTo to copy into temporary array. Don't
  215. save redundant _usedSlots and _threshold.
  216. (OnDeserialization): Rewrite.
  217. (ICollection<>.CopyTo): Forward to CopyTo.
  218. (Enumerator._nextIndex): Rename to from _index.
  219. (Enumerator._next, Enumerator.FixNext): Remove.
  220. (Enumerator.Current): Rewrite to avoid need for _next.
  221. (Enumerator.IEnumerator.Reset): Update.
  222. (KeyCollection): Is also IEnumerable<TKey> and IEnumerable.
  223. Update methods to conform to standard.
  224. (KeyCollection.GetEnumerator): Restore. Return the correct type.
  225. (KeyCollection.Enumerator): Rename from KeyEnumerator. Simple
  226. wrapper that forwards to Dictionary<,>.Enumerator.
  227. (ValueCollection): Likewise.
  228. 2005-06-12 David Waite <[email protected]>
  229. * IKeyComparer.cs: removed
  230. * KeyValuePair.cs: add same-style ToString as ms.net Beta2 impl,
  231. make Serializable, use correct field names.
  232. * Dictionary.cs: Miscelaneus clean-ups, added serialization
  233. support, use Hashtable prime functions
  234. 2005-06-12 Ben Maurer <[email protected]>
  235. * Comparer.cs, EqualityComparer.cs: Important performance hack:
  236. make sure that we don't box stuff and do reflection on every
  237. comparison. We use reflection at cctor time rather than on every
  238. request.
  239. 2005-06-09 Raja R Harinath <[email protected]>
  240. Simplify Enumerator.MoveNext to make it "obviously correct", rather
  241. than require subtle reasoning about the state of various variables.
  242. * Dictionary.cs (Enumerator._isValid): Remove. Replace all uses
  243. with "_current == null".
  244. (Enumerator._validNodeVisited): Remove.
  245. (Enumerator._next): New. Holds the the next position.
  246. (Enumerator.FixNest): New helper function that ensures that _next
  247. has the right value.
  248. (Enumerator.MoveNext): Simplify. Now, copies _next to _current
  249. and advances _next if possible.
  250. 2005-06-08 Martin Baulig <[email protected]>
  251. * Dictionary.cs (Dictionary.KeyEnumerator): Removed the public
  252. GetEnumerator() function since it's returning the wrong type.
  253. (Dictionary.ValueEnumerator): Likewise. Fix #75073.
  254. 2005-06-08 Ankit Jain <[email protected]>
  255. * Dictionary.cs (Dictionary<TKey, TValue>.MoveNext): Allow traversal of chain in last slot
  256. of the table. Fixes #75168.
  257. 2005-06-04 Ben Maurer <[email protected]>
  258. * *.cs: 2.0 api fixups
  259. 2005-05-26 Miguel de Icaza <[email protected]>
  260. * Dictionary.cs: Remove the `Hash' name from the Dictionary
  261. internal classes, make them public.
  262. 2005-05-26 Zoltan Varga <[email protected]>
  263. * Dictionary.cs: Fix a warning.
  264. * IDictionary.cs: Add missing TryGetValue method.
  265. 2005-05-19 Geoff Norton <[email protected]>
  266. * List.cs (Insert): Resize the array before the shift if needed
  267. 2005-05-18 Miguel de Icaza <[email protected]>
  268. * List.cs (GetRange): Implement.
  269. Do not do lazy loading of data. Not worth adding an
  270. extra check, and not worth the bugs.
  271. This decision wont be discussed until: a) a full List regression
  272. test suite exists and b) performance benchmarks are created. (b)
  273. depends on (a) or the argument wont even be heard.
  274. 2005-05-13 Atsushi Enomoto <[email protected]>
  275. * Queue.cs, Stack.cs: moved to System.dll
  276. 2005-05-06 Martin Baulig <[email protected]>
  277. * *.cs: Add CLSCompliant(true) where missing.
  278. 2005-05-06 Zoltan Varga <[email protected]>
  279. * *.cs: Remove CLSCompliant(false) attributes.
  280. 2005-05-05 Zoltan Varga <[email protected]>
  281. * List.cs: Applied patch from Mart Roosmaa ([email protected]).
  282. Fix Insert method. Fixes #74824.
  283. 2005-04-29 Martin Baulig <[email protected]>
  284. Reflect latest spec changes.
  285. * IEnumerable.cs (IEnumerable<T>): Implement IEnumerable.
  286. * IEnumerator.cs (IEnumerator<T>): Implement IEnumerator.
  287. 2005-04-29 Raja R Harinath <[email protected]>
  288. Remove FIXME.
  289. * Dictionary.cs (Slot<K,V>): Move to ...
  290. (Dictionary<K,V>.Slot): ... here.
  291. 2005-04-28 Martin Baulig <[email protected]>
  292. * Dictionary.cs, Queue.cs, Stack.cs, List.cs, Comparer.cs: Don't
  293. duplicate type parameters in the nested classes.
  294. 2005-04-20 Zoltan Varga <[email protected]>
  295. * List.cs: Fix ToArray () method. Fixes #74675.
  296. 2005-04-04 Raja R Harinath <[email protected]>
  297. * Dictionary.cs: Update to draft of Feb 27. Add some argument checks.
  298. (GetSlot): Don't throw KeyNotFoundException. Unify all list
  299. traversals in here. Move found key to head of chain, and return
  300. the index of the chain suitable for/containing the key.
  301. (Item, Add, Remove): Simplify, and remove FIXMEs.
  302. (Resize): Reuse linked list nodes from old table.
  303. (Dictionary.CopyTo, HashKeyCollection.CopyTo, HashValueCollection.CopyTo):
  304. Add some argument checks.
  305. 2005-04-02 Ben Maurer <[email protected]>
  306. * Dictionary.cs: Real impl.
  307. 2005-02-21 Martin Baulig <[email protected]>
  308. * IComparer.cs: Reverted the last change here, Equals() and
  309. GetHashCode() have been removed a long time ago.
  310. 2005-02-21 Kazuki Oikawa <[email protected]>
  311. * IComparer.cs, IDictionary.cs: Corrected the wrong declaration.
  312. 2005-02-11 Carlos Alberto Cortez <[email protected]>
  313. * List.cs: Added internal ReadOnlyCollection class,
  314. which is a wrapper for a read only IList<T> version of the List<T>.
  315. Used in AsReadOnly () method.
  316. 2005-02-07 Ben Maurer <[email protected]>
  317. * List.cs (CheckRange): Comparison error. Duh!
  318. (Shift): really deal with neg. delta. Also, adjust the `size'.
  319. Based on a patch from Marc Denty ([email protected]).
  320. Fixes #72258.
  321. 2005-01-29 Ben Maurer <[email protected]>
  322. * Queue.cs: `duh' bugs.
  323. 2004-12-27 Ben Maurer <[email protected]>
  324. * Stack.cs: Stupid bug fixes.
  325. * List.cs: My new (mostly untested ;-) impl of List
  326. <T>. Implements most of the API.
  327. 2004-12-26 Ben Maurer <[email protected]>
  328. * Queue.cs: New, non-linked-list based impl.
  329. 2004-11-29 Ben Maurer <[email protected]>
  330. * Comparer.cs: Update this class.
  331. 2004-11-25 Carlos Alberto Cortez <[email protected]>
  332. * List.cs: Enumerator changed to behave like the MS impl.
  333. 2004-11-25 Ben Maurer <[email protected]>
  334. * Stack.cs: New, list based impl. Waiting for some gmcs fixes.
  335. 2004-11-10 Martin Baulig <[email protected]>
  336. * IDictionary.cs (IDictionary): `IsReadOnly' and `Clear' are
  337. inherited from ICollection.
  338. 2004-09-20 Gert Driesen <[email protected]>
  339. * ReadOnlyCollection.cs: Moved to System assembly
  340. * Collection.cs: Moved to System assembly
  341. 2004-09-07 Carlos Alberto Cortez <[email protected]>
  342. * ReadOnlyCollection.cs: New file and changes to
  343. Collection.cs tu support it.
  344. 2004-09-05 Marek Safar <[email protected]>
  345. * Dictionary.cs: Added new file (no implementation).
  346. 2004-09-03 Carlos Alberto Cortez <[email protected]>
  347. * Collection.cs: Small improvements related to
  348. style, resizing, and type checking.
  349. 2004-09-01 Carlos Alberto Cortez <[email protected]>
  350. * Collection.cs: New file.
  351. 2004-08-04 Martin Baulig <[email protected]>
  352. * List.cs (List<T>.Enumerator): Made this a struct.
  353. (List<T>.GetEnumerator): The public method now returns the
  354. `Enumerator' struct.
  355. 2004-08-02 Martin Baulig <[email protected]>
  356. Started to do some API review.
  357. * ICollection.cs (ICollection<T>): Added IsReadOnly, Add, Clear,
  358. Contains and Remove.
  359. * IList.cs (IList<T>): Removed Add, Clear, Constains, Remove,
  360. IsReadOnly and IsFixedSize.
  361. 2004-08-02 Martin Baulig <[email protected]>
  362. * IList.cs (IList.Add): Changed return type to void.
  363. * List.cs (List.Add): Likewise.
  364. 2004-07-16 Martin Baulig <[email protected]>
  365. * IComparable.cs: Removed, it's in System.
  366. 2004-07-12 Duncan Mak <[email protected]>
  367. * KeyNotFoundException.cs: Added.
  368. 2004-06-18 Ben Maurer <[email protected]>
  369. * Comparer.cs: v2 impl. Some workarounds for gmcs are enabled.
  370. 2004-05-26 Sebastien Pouliot <[email protected]>
  371. * Queue.cs: Fixed possible integer overflow in CopyTo methods.
  372. * Stack.cs: Fixed possible integer overflow in CopyTo methods.
  373. 2004-03-13 Martin Baulig <[email protected]>
  374. * Stack.cs, Queue.cs, List.cs: Implement the non-generic interfaces.
  375. 2004-03-11 Martin Baulig <[email protected]>
  376. * List.cs: New file.
  377. 2004-03-11 Martin Baulig <[email protected]>
  378. * Stack.cs, Queue.cs: Just use `Node' for the nested class, not
  379. `Node<T>' (which would create another type parameter `T'
  380. overriding `T' from the outer class).
  381. 2004-02-23 Martin Baulig <[email protected]>
  382. * Stack.cs, Queue.cs: New files. Hmm, looks like I forgot to add
  383. them to CVS; they're already on my hard disk since December or so.
  384. 2003-12-08 Martin Baulig <[email protected]>
  385. * *.cs: require GENERICS.
  386. 2003-11-08 Ben Maurer <[email protected]>
  387. * *.cs: require NET_2_0 and GENERICS
  388. 2003-11-07 Ben Maurer <[email protected]>
  389. * IComparable.cs, IComparer.cs, IDictionary.cs, IKeyComparer.cs, KeyValuePair.cs
  390. Added.
  391. 2003-11-06 Martin Baulig <[email protected]>
  392. * ICollection.cs, IList.cs, IEnumerator.cs, IEnumerable.cs:
  393. Started to implement the System.Collections.Generic classes.