/// <summary> /// 转换为可枚举集合 /// </summary> /// <typeparam name="T">数据类型</typeparam> /// <param name="root">根</param> /// <param name="childSelector">下层数据选择器</param> /// <param name="predicate">子孙筛选条件</param> /// <param name="enumerateType">枚举方式</param> /// <returns>已枚举的集合</returns> public static IEnumerable <IHierarchical <T> > AsEnumerable <T>(this IHierarchical <T> root, Func <IHierarchical <T>, IEnumerable <IHierarchical <T> > > childSelector, Func <IHierarchical <T>, bool> predicate, EnumerateType enumerateType = EnumerateType.DfsDlr) { yield return(root); switch (enumerateType) { case EnumerateType.DfsDlr: foreach (var descendant in GetDescendantDfsDlr(root, childSelector, predicate)) { yield return(descendant); } break; case EnumerateType.Bfs: foreach (var descendant in GetDescendantsBfs(root, childSelector, predicate)) { yield return(descendant); } break; } }
/// <summary> /// 转换为可枚举集合 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="root">根</param> /// <param name="enumerateType">枚举方式</param> /// <returns>已枚举的集合</returns> public static IEnumerable <T> AsEnumerable <T>(this ITree <T> root, EnumerateType enumerateType = EnumerateType.DfsDlr) where T : ITree <T> { foreach (var item in root.AsHierarchical().AsEnumerable(enumerateType)) { yield return((T)item.Current); } }
/// <summary> /// 转换为可枚举集合 /// </summary> /// <typeparam name="T">数据类型</typeparam> /// <param name="root">根</param> /// <param name="predicate">子孙筛选条件</param> /// <param name="enumerateType">枚举方式</param> /// <returns>已枚举的集合</returns> public static IEnumerable <IHierarchical <T> > AsEnumerable <T>(this IHierarchical <T> root, EnumerateType enumerateType = EnumerateType.DfsDlr, Func <IHierarchical <T>, bool> predicate = null) { switch (enumerateType) { case EnumerateType.DfsDlr: yield return(root); foreach (var descendant in GetDescendantsDfsDlr(root, predicate)) { yield return(descendant); } break; case EnumerateType.DfsLrd: foreach (var descendant in GetDescendantsDfsLrd(root, predicate)) { yield return(descendant); } yield return(root); break; case EnumerateType.Bfs: yield return(root); foreach (var descendant in GetDescendantsBfs(root, predicate)) { yield return(descendant); } break; default: throw new ArgumentOutOfRangeException(nameof(enumerateType), enumerateType, null); } }
private static ScriptValue CreateArrayIterator([NotNull] Agent agent, [NotNull] ScriptObject array, EnumerateType kind) { //https://tc39.github.io/ecma262/#sec-createarrayiterator var iterator = agent.ObjectCreate(agent.Realm.ArrayIteratorPrototype, SpecialObjectType.ArrayIterator); iterator.IteratedObject = array; iterator.ArrayIteratorNextIndex = 0; iterator.ArrayIterationKind = kind; return(iterator); }
private static IEnumerable <ScriptValue> EnumerableOwnProperties([NotNull] Agent agent, [NotNull] ScriptObject obj, EnumerateType type) { //https://tc39.github.io/ecma262/#sec-enumerableownproperties var ownKeys = obj.OwnPropertyKeys(); var properties = new List <ScriptValue>(); foreach (var key in ownKeys) { if (key.IsString) { var descriptor = obj.GetOwnProperty(key); if (descriptor != null && descriptor.Enumerable) { switch (type) { case EnumerateType.Key: properties.Add(key); break; case EnumerateType.Value: properties.Add(obj.Get(key)); break; case EnumerateType.KeyValue: properties.Add(ArrayIntrinsics.CreateArrayFromList(agent, new[] { key, obj.Get(key) })); break; default: throw new ArgumentOutOfRangeException(nameof(type), type, null); } } } } return(properties); }