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; } }
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); }
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)); }
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)); }