private static Result Uniq(Evaluator.Args args) { var fieldToGroupBy = args.GetStrSwitch("k", null); Func <object, object> keySelector = o => o; if (!string.IsNullOrEmpty(fieldToGroupBy)) { keySelector = o => args.Eval.Resolve(o).Properties.FirstOrDefault(p => p.Name == fieldToGroupBy)?.Value; } var aa = args.Flatten(); var groups = aa.GroupBy(obj => args.Preview(keySelector(obj))); if (args.HasSwitch("c")) // count objects in each group { return(groups .Select(grp => { return new ObjectInfo( preview: $"{grp.Count()}: {grp.Key}", properties: new[] { new Property(name: "Key", value: grp.Key), new Property(name: "Count", value: grp.Count()), new Property(name: "Elems", value: grp.ToArray()) }); }) .ToArray()); } else { return(groups .Select(grp => grp.First()) .ToArray()); } }
private static Result Sort(Evaluator.Args args) { var objs = args.Flatten(); var fieldToSortBy = args.GetStrSwitch("k", null); Func <object, object> keySelector = o => o; if (!string.IsNullOrEmpty(fieldToSortBy)) { keySelector = o => args.Eval.Resolve(o).Properties.FirstOrDefault(p => p.Name == fieldToSortBy)?.Value; } IComparer <object> comparer = args.HasSwitch("n") ? Comparer <object> .Create((lhs, rhs) => Comparer <long?> .Default.Compare(args.Eval.TryToNumber(lhs), args.Eval.TryToNumber(rhs))) : Comparer <object> .Create((lhs, rhs) => Comparer <string> .Default.Compare(args.Preview(lhs), args.Preview(rhs))); var ordered = objs.OrderBy(keySelector, comparer); var finalOrder = args.HasSwitch("r") // reverse ? ordered.Reverse() : ordered; return(finalOrder.ToArray()); }
private static Result StrCat(Evaluator.Args args, string defaultSeparator) { return(string.Join( args.GetStrSwitch("d", defaultSeparator), args.Flatten().Select(args.Preview))); }