private List <TsvDataViewModel> FindActualParents(TsvDataViewModel parent, string name) { var lowestChildren = TsvDataViewModel.GetLowestLevelItems(parent); if (lowestChildren.All(Expressions[name])) { return(new List <TsvDataViewModel> { parent }); } else { var children = lowestChildren.Where(Expressions[name]); var result = new List <TsvDataViewModel>(); foreach (var item in children) { var newParent = GetParent(parent.Level + 1, item); if (newParent != null && !result.Contains(newParent)) { result.Add(newParent); } } return(result); } }
public List <TsvDataViewModel> Parse(List <TsvDataViewModel> sourceData, Action <string, string> callback = null) { var result = new List <TsvDataViewModel>(); Logger.Debug("Enter GroupEngine to parse"); try { sourceData = sourceData.SelectMany(o => TsvDataViewModel.GetLowestLevelItems(o)).ToList(); var groups = Ioc.Default.GetInstance <Config>().Settings.Groups; foreach (var group in groups) { var func = Evaluator.Evaluate <Func <TsvDataViewModel, bool> >(group.Expression); Expressions[group.Name] = func; var list = sourceData.Where(func).ToList(); if (list.Count > 0) { var vm = new TsvDataViewModel { Item = group.Name, Level = 0, Description = group.Description }; vm.Children = new ObservableCollection <TsvDataViewModel>(list); result.Add(vm); } } if (result.Count > 0) { CalcPrice(result); } } catch (Exception ex) { Logger.Error($"Group engine parse error:{ex.StackTrace}"); callback?.Invoke("Error", "Group engine parse data failed"); } return(result); }
// get specified level parent TsvDataViewModel GetParent(int level, TsvDataViewModel vm) { TsvDataViewModel node = vm; if (node.Level == level && !node.HasChildren) { return(node); } while (node.HasParent && node.Level > level) { node = node.Parent; if (node.Level == level) { return(node); } } return(null); }