public static List <T> ApplyFilterMember <T>(string[] args, out int argsUsed, StringArgParser changeType, List <T> current, object relativeTo, bool removeMatches, OutputDelegate warn, bool negative, char compareChar, CompareTestChar compareObjects, FilterMember fmemb) { object arg1 = null; if (fmemb.CastArgTo != null) { int len1 = args.Length - 1; string[] destargs = new string[len1]; Array.Copy(args, 1, destargs, 0, len1); int argsUsedLocal; arg1 = changeType(destargs, out argsUsedLocal, fmemb.CastArgTo); argsUsed = 1 + argsUsedLocal; } else { argsUsed = 1; } List <T> putInto = new List <T>(); Action <T> WhenTrue; if (negative) { putInto.AddRange(current); WhenTrue = (o) => putInto.Remove(o); } else { WhenTrue = (o) => putInto.Add(o); } foreach (T i in current) { object posresult = fmemb.Function(i, arg1, relativeTo); if (fmemb.PreCompare) { posresult = compareObjects(compareChar, posresult, arg1); } if (fmemb.IsCollectionType) { if (typeof(T).IsInstanceOfType(posresult)) { WhenTrue((T)posresult); continue; } var ie = (IEnumerable)posresult; foreach (var item in ie) { WhenTrue((T)item); } continue; } else { if ((bool)posresult) { WhenTrue(i); } } } return(putInto); }
public static List <T> ApplyFilter <T>(string[] args, out int argsUsed, StringArgParser changeType, List <T> current, object relativeTo, bool removeMatches, OutputDelegate warn, CompareTestChar compareTestChar) { if (current.Count == 0) { argsUsed = args.Length; return(current); } var example = current[0]; Type exampleType = example.GetType(); string arg0Lower = args[0]; bool negative = removeMatches; if (arg0Lower.StartsWith("!")) { negative = !negative; arg0Lower = arg0Lower.Substring(1); } int predAt = arg0Lower.IndexOfAny("<>=*".ToCharArray()); char compareChar = '='; if (predAt > 1) { compareChar = arg0Lower[predAt]; arg0Lower = arg0Lower.Substring(predAt); } var possible = FindFiltersForTarget(arg0Lower, example, relativeTo, warn); if (possible == null || possible.Count == 0) { throw new ParserFilterFormatException(arg0Lower, args, 0); } foreach (FilterMember member in possible) { return(ApplyFilterMember(args, out argsUsed, changeType, current, relativeTo, removeMatches, warn, negative, compareChar, compareTestChar, member)); } throw new ParserFilterFormatException(arg0Lower, args, 0); }