Classify values depending on predicates
public List&lt;T&gt;[] Classify&lt;T&gt;(IEnumerable&lt;T&gt; sequence, params Predicate&lt;T&gt;[] predicates)
{
    var result = new List&lt;T&gt;[predicates.Length + 1];
    // It's clearer to create elements of the array explicitly
    for (int i = 0; i &lt; result.Length; i++)
        result[i] = new List&lt;T&gt;();

    foreach (var elem in sequence)
    {
        var index = predicates.TakeWhile(p =&gt; !p(elem))
                              .Count();

        result[index].Add(elem);
    }
}


There is a few LINQ methods to get an index, f.e. Select((i, e) =&gt; ...). If the list of unsatisfied elements was the first (0th), I would use Select. But since it is the last, TakeWhile gives the shorter code.