/// <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);
            }
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }