/// <summary> /// 通过深度数组来移除数组中的一个值 /// </summary> /// <param name="dict">规定字典</param> /// <param name="keys">深度数组(深度数组以倒序传入)</param> private static bool RemoveValueByDepthArray(IDictionary <string, object> dict, ref string[] keys) { var perv = new Stack <KeyValuePair <string, IDictionary <string, object> > >(keys.Length); while (true) { if (keys.Length <= 1) { dict.Remove(Arr.Pop(ref keys)); while (perv.Count > 0) { var data = perv.Pop(); var tmpDict = (IDictionary <string, object>)data.Value[data.Key]; if (tmpDict.Count <= 0) { data.Value.Remove(data.Key); continue; } break; } return(true); } object result; var key = Arr.Pop(ref keys); if (!dict.TryGetValue(key, out result) || !(result is IDictionary <string, object>)) { return(false); } perv.Push(new KeyValuePair <string, IDictionary <string, object> >(key, dict)); dict = (IDictionary <string, object>)result; } }
/// <summary> /// 通过深度数组来访问字典 /// </summary> /// <param name="dict">规定字典</param> /// <param name="keys">深度数组(深度数组以倒序传入)</param> /// <returns>字典值</returns> private static object GetValueByDepthArray(IDictionary <string, object> dict, ref string[] keys) { while (true) { if (!dict.TryGetValue(Arr.Pop(ref keys), out object result) || keys.Length <= 0) { return(result); } dict = result as IDictionary <string, object>; if (dict == null) { return(null); } } }
/// <summary> /// 通过深度数组来访问字典,并为其指定位置设定一个值 /// </summary> /// <param name="dict">规定字典</param> /// <param name="keys">深度数组(深度数组以倒序传入)</param> /// <param name="value">设定值</param> private static void SetValueByDepthArray(IDictionary <string, object> dict, ref string[] keys, object value) { while (true) { if (keys.Length <= 1) { dict[Arr.Pop(ref keys)] = value; return; } var key = Arr.Pop(ref keys); if (!dict.TryGetValue(key, out object result) || !(result is IDictionary <string, object>)) { dict[key] = result = new Dictionary <string, object>(); } dict = (IDictionary <string, object>)result; } }