RCollectionUtil.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:3k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: RCollectionUtil.cs,v 1.2 2005/04/20 08:45:45 okajima Exp $
  4. */
  5. using System;
  6. using System.Collections;
  7. namespace Poderosa.Toolkit
  8. {
  9. /// <summary>
  10. /// 僐儞僗僩儔僋僞偵搉偝傟偨IEnumerator偑IEnumerable傪楍嫇偡傞偲偒偵偦傟傜傪楢寢偟偨宍偵尒偣傞Enumerator
  11. /// Tree偺拞恎偺楍嫇側偳偵巊偊傞
  12. /// </summary>
  13. internal class NestedEnumerator : IEnumerator {
  14. private IEnumerator _parent;
  15. private IEnumerator _child;
  16. public NestedEnumerator(IEnumerator en) {
  17. _parent = en;
  18. _child = null;
  19. }
  20. public NestedEnumerator(IEnumerator en, IEnumerator ch) {
  21. _parent = en;
  22. _child = ch;
  23. }
  24. public void Reset() {
  25. throw new NotSupportedException("Reset() is unsupported");
  26. }
  27. public bool MoveNext() {
  28. if(_child!=null) {
  29. if(_child.MoveNext())
  30. return true;
  31. }
  32. if(_parent.MoveNext()) {
  33. _child = ((IEnumerable)_parent.Current).GetEnumerator();
  34. return _child.MoveNext();
  35. } else
  36. return false;
  37. }
  38. public object Current {
  39. get {
  40. if(_child==null)
  41. throw new InvalidOperationException("Current property is referenced before MoveNext() is called");
  42. else
  43. return _child.Current;
  44. }
  45. }
  46. }
  47. internal class ConcatEnumerator : IEnumerator {
  48. private IEnumerator _first;
  49. private IEnumerator _second;
  50. public ConcatEnumerator(IEnumerator first, IEnumerator second) {
  51. _first = first;
  52. _second = second;
  53. }
  54. public object Current {
  55. get {
  56. if(_first!=null)
  57. return _first.Current;
  58. else
  59. return _second.Current;
  60. }
  61. }
  62. public bool MoveNext() {
  63. if(_first!=null) {
  64. bool r = _first.MoveNext();
  65. if(r) return true;
  66. }
  67. _first = null;
  68. return _second.MoveNext();
  69. }
  70. public void Reset() {
  71. throw new NotSupportedException();
  72. }
  73. }
  74. internal class CollectionUtil {
  75. public static IEnumerator NextEnumerator(IEnumerator e) {
  76. if(!e.MoveNext()) throw new InvalidOperationException("MoveNext() failed");
  77. return e;
  78. }
  79. public static Array DeepClone(Array src, Type type) {
  80. Array n = Array.CreateInstance(type, src.Length);
  81. for(int i=0; i<n.Length; i++) {
  82. object t = src.GetValue(i);
  83. n.SetValue(t==null? null : ((ICloneable)t).Clone(), i);
  84. }
  85. return n;
  86. }
  87. //Key偲Value傪擖傟懼偊偨儅僢僾傪曉偡丅Value偑偐傇偭偰偄側偄慜採
  88. public static Hashtable ReverseHashtable(Hashtable src) {
  89. Hashtable r = new Hashtable();
  90. IDictionaryEnumerator ie = src.GetEnumerator();
  91. while(ie.MoveNext()) {
  92. r.Add(ie.Value, ie.Key);
  93. }
  94. return r;
  95. }
  96. }
  97. }