I've to do a generic method Classify<T>
that, given a sequence of elements of type T
and an arbitrary number of predicates, returns an array of n+1
lists (where n
is the number of the predicates). More precisely, if the element satisfies the first predicate then it is added to the first list. If not, then if the element satisfies the second predicate it is added to the second list, etc. If none of the predicates can be applied to one element, then that element is added to the last list (the n+1 th).
I managed to do that with the following code. Is there any way to do it better, maybe with Linq?
public List<T>[] Classify<T>(IEnumerable<T> sequence, params Predicate<T>[] predicates)
{
var result = new List<T>[predicates.Length+1];
var counter = 0;
foreach (var elem in sequence)
{
var valid = false;
foreach (var predicate in predicates)
{
if(result[counter]==null)
result[counter] = new List<T>();
if (predicate(elem) && valid==false)
{
var partition = result[counter];
partition.Add(elem);
valid = true;
}
counter++;
}
if (!valid)
{
if (result[counter] == null)
result[counter] = new List<T>();
result[counter].Add(elem);
}
counter=0;
}
return result;
}