What I have is an outer loop which loops through a list of strings, followed by another loop which loops through a list of filters; and if the current column is the current filter in the list of filters, it then applies this filter.
I'm just trying to tidy up a messy function but can't see anyway of doing so.
public static bool PassRules(List<string>columnsList, List<Customfilters> customfilters )
{
var i = 0;
foreach (var column in columnsList)
{
var curFilter = new Customfilters();
foreach (var customfilterse in customfilters.Where(customfilterse => customfilterse.Field.Equals(Filed[i])))
{
curFilter = customfilterse;
}
if ( !string.IsNullOrEmpty(curFilter.Filter))
{
int n;
var isNumeric = int.TryParse(column, out n);
if (isNumeric)
{
if (!Compare(curFilter.Expression, Convert.ToDouble(column), Convert.ToDouble(curFilter.Filter)))
{
return false;
}
}
else
{
if (curFilter.Expression.Equals("IN") || curFilter.Expression.Equals("NOT IN"))
{
var toList = curFilter.Filter.Split(Convert.ToChar(","));
if (!CompairInNotIn(toList.ToList(), curFilter.Expression, column))
{
return false;
}
}
else
{
if (!Compare(curFilter.Expression, column, curFilter.Filter))
{
return false;
}
}
}
}
i++;
}
return true;
}
public static bool Compare<T>(string op, T left, T right) where T : IComparable<T>
{
switch (op)
{
case "<": return left.CompareTo(right) < 0;
case ">": return left.CompareTo(right) > 0;
case "<=": return left.CompareTo(right) <= 0;
case ">=": return left.CompareTo(right) >= 0;
case "==": return left.Equals(right);
case "!=": return !left.Equals(right);
default: throw new ArgumentException("Invalid comparison operator: {0}", op);
}
}
public static bool CompairInNotIn(List<string> list, string op, string column)
{
if (op.Equals("IN"))
{
return list.Any(column.Contains);
}
if (op.Equals("NOT IN"))
{
return !list.Any(column.Contains);
}
return true;
}
Just to explain a few fields:
var tmpFilter1 = new Customfilters { Field = "IMA01", Expression = "==", Filter = "HP" };
Field[i]
is a dictionary of <int,string>
and basically returns the ID of the field name.