You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
5.6 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. using Apewer;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Collections.Specialized;
  5. using System.Text;
  6. namespace Apewer
  7. {
  8. /// <summary></summary>
  9. [Serializable]
  10. public class StringPairs : List<KeyValuePair<string, string>>, IToJson
  11. {
  12. /// <summary></summary>
  13. public StringPairs() : base() { }
  14. /// <summary></summary>
  15. public StringPairs(int capacity) : base(capacity) { }
  16. /// <summary></summary>
  17. public string this[string key]
  18. {
  19. get { return GetValue(key); }
  20. }
  21. /// <summary>添加项。返回错误信息。</summary>
  22. public string Add(string key, string value)
  23. {
  24. if (string.IsNullOrEmpty(key)) return "参数 Key 无效。";
  25. // if (string.IsNullOrEmpty(value)) return "参数 Value 无效。";
  26. var kvp = new KeyValuePair<string, string>(key, value);
  27. Add(kvp);
  28. return null;
  29. }
  30. /// <summary>获取所有 Key。</summary>
  31. public string[] GetAllKeys()
  32. {
  33. var keys = new string[Count];
  34. for (var i = 0; i < Count; i++) keys[i] = this[i].Key;
  35. return keys;
  36. }
  37. /// <summary>获取匹配 Key 的所有 Value,不存在 Key 或 Value 时返回空数组。</summary>
  38. public string[] GetValues(string key, bool ignoreCase = true, bool withEmpty = true)
  39. {
  40. if (string.IsNullOrEmpty(key)) return new string[0];
  41. var lowerArg = TextUtility.Lower(key);
  42. var values = new List<string>();
  43. foreach (var item in this)
  44. {
  45. if (item.Key == key)
  46. {
  47. if (withEmpty || !string.IsNullOrEmpty(item.Value)) values.Add(item.Value);
  48. continue;
  49. }
  50. if (ignoreCase)
  51. {
  52. var lowerItem = TextUtility.Lower(item.Key);
  53. if (lowerItem == lowerArg)
  54. {
  55. if (withEmpty || !string.IsNullOrEmpty(item.Value)) values.Add(item.Value);
  56. continue;
  57. }
  58. }
  59. }
  60. return values.ToArray();
  61. }
  62. /// <summary>获取匹配 Key 的 Value。不存在 Key 时返回 NULL 值。</summary>
  63. public string GetValue(string key, bool ignoreCase = true)
  64. {
  65. if (string.IsNullOrEmpty(key)) return null;
  66. // 先精准匹配。
  67. foreach (var item in this)
  68. {
  69. if (string.IsNullOrEmpty(item.Key)) continue;
  70. if (item.Key == key)
  71. {
  72. if (string.IsNullOrEmpty(item.Value)) continue;
  73. return item.Value;
  74. }
  75. }
  76. // 再模糊匹配。
  77. if (ignoreCase)
  78. {
  79. var lowerArg = TextUtility.Lower(key);
  80. foreach (var item in this)
  81. {
  82. if (string.IsNullOrEmpty(item.Key)) continue;
  83. var lowerKey = TextUtility.Lower(item.Key);
  84. if (lowerKey == lowerArg)
  85. {
  86. if (string.IsNullOrEmpty(item.Value)) continue;
  87. return item.Value;
  88. }
  89. }
  90. }
  91. return null;
  92. }
  93. /// <summary>对 Key 升序排序。</summary>
  94. public new void Sort()
  95. {
  96. SortAsc();
  97. }
  98. /// <summary>对 Key 升序排序。</summary>
  99. public void SortAsc()
  100. {
  101. base.Sort(new Comparison<KeyValuePair<string, string>>((a, b) => a.Key.CompareTo(b.Key)));
  102. }
  103. /// <summary>对 Key 降序排序。</summary>
  104. public void SortDesc()
  105. {
  106. base.Sort(new Comparison<KeyValuePair<string, string>>((b, a) => a.Key.CompareTo(b.Key)));
  107. }
  108. /// <summary>检查拥有指定的 Key。</summary>
  109. public bool HasKey(string key, bool ignoreCase = false)
  110. {
  111. var a = ignoreCase ? key.Lower() : key;
  112. if (string.IsNullOrEmpty(a))
  113. {
  114. foreach (var k in GetAllKeys())
  115. {
  116. if (string.IsNullOrEmpty(k)) return true;
  117. }
  118. }
  119. else
  120. {
  121. foreach (var k in GetAllKeys())
  122. {
  123. var b = ignoreCase ? k.Lower() : k;
  124. if (a == b) return true;
  125. }
  126. }
  127. return false;
  128. }
  129. /// <summary></summary>
  130. public Json ToJson() => ToJson(false);
  131. /// <summary></summary>
  132. public Json ToJson(bool lowerKey)
  133. {
  134. var array = Json.NewArray();
  135. foreach (var pair in this)
  136. {
  137. var item = Json.NewObject();
  138. item[lowerKey ? "key" : "Key"] = pair.Key ?? "";
  139. item[lowerKey ? "value" : "Value"] = pair.Value ?? "";
  140. array.AddItem(item);
  141. }
  142. return array;
  143. }
  144. /// <summary>从指定对象解析,生成 StringPairs 对象实例为副本。</summary>
  145. public static StringPairs From(NameValueCollection collection)
  146. {
  147. var sp = new StringPairs();
  148. if (collection != null)
  149. {
  150. sp.Capacity = collection.Count;
  151. foreach (var key in collection.AllKeys)
  152. {
  153. sp.Add(key, collection[key]);
  154. }
  155. sp.Capacity = sp.Count;
  156. }
  157. return sp;
  158. }
  159. }
  160. }