Пример #1
0
 public SelectableList(int capacity)
 {
     items   = new List <T>(capacity);
     indexes = new ListIndexes <T> {
         Source = this
     };
     type = typeof(T);
     if (TypeHelper.IsInterface(type, typeof(INotifyPropertyChanged)))
     {
         propertyHandler = OnItemPropertyChanged;
     }
 }
Пример #2
0
        public static IEnumerable <T> Select <T>(IEnumerable <T> items, Query <T> query, ListIndexes <T> indexes = null)
        {
            IEnumerable <T> buffer = items;
            var             stack  = new Stack <SelectStackEntry <T> >(0);
            bool?           flag   = null;

            foreach (var parameter in query.GetEnabled())
            {
                var curParameter = parameter;
                var temp         = Select <T>(curParameter.Logic == LogicType.And ? buffer : items, curParameter, indexes);
                if ((curParameter.Group & QueryGroup.Begin) == QueryGroup.Begin)
                {
                    stack.Push(new SelectStackEntry <T>()
                    {
                        Buffer = temp, Parameter = curParameter
                    });
                    continue;
                }
                else if (stack.Count > 0)
                {
                    var entry = stack.Pop();
                    entry.Buffer = Concat(entry.Buffer, temp, curParameter);
                    if ((curParameter.Group & QueryGroup.End) == QueryGroup.End)
                    {
                        temp         = entry.Buffer;
                        curParameter = entry.Parameter;
                    }
                    else
                    {
                        stack.Push(entry);
                        continue;
                    }
                }
                if (flag == null)
                {
                    buffer = temp;
                    flag   = true;
                }
                else
                {
                    buffer = Concat(buffer, temp, curParameter);
                }
            }
            return(buffer);
        }
Пример #3
0
        public static IEnumerable <T> Select <T>(IEnumerable <T> items, QueryParameter <T> param, ListIndexes <T> indexes = null)
        {
            if (param.AlwaysTrue)
            {
                return(items);
            }

            if (param.Comparer.Type == CompareTypes.Distinct)
            {
                return(Distinct(items, param.Invoker));
            }

            var index = indexes?.GetIndex(param.Name);

            if (index != null)
            {
                return(index.Scan(param));
            }
            return(Search <T>(items, param));
        }
Пример #4
0
        public static IEnumerable <T> Select <T>(IEnumerable <T> items, QueryParameter <T> param, ListIndexes <T> indexes = null)
        {
            var index = indexes?.GetIndex(param.Name);

            if (index != null)
            {
                return(index.Scan(param));
            }
            return(Search <T>(items, param));
        }