Separate List(Of Tuple(Of String, Integer)) to get two List(Of String) matching/not predicate

I need to separate a List(Of Tuple(Of String, Integer)) to get two List's(Of String). If the String matching some function ValidateFormat(returns Boolean), then I need it in "match" List, if not - in "notMatch" List.

I can use Where extension method twice to get two List's(Of Tuple, Integer):

    Dim initial As List(Of Tuple(Of String, Integer))
    '...initial List filled..'
    Dim match As List(Of Tuple(Of String, Integer)) = _
    initial.Where(Function(x) ValidateFormat(x.Item1)).ToList
    Dim notMatch As List(Of Tuple(Of String, Integer)) = _
    initial.Where(Function(x) Not ValidateFormat(x.Item1)).ToList

But I need just Lists of String, not Tuple. Is there an effective way to do this? Thanks.

Jon Skeet
people
quotationmark

I'd use something like:

var lookups = initial.ToLookup(x => ValidateFormat(x.Item1), x => x.Item2);
var match = lookups[true].ToList();
var notMatch = lookups[false].ToList();

That checks each item once, splitting the collection into groups of "matching" or "not matching" - and the second argument to ToLookup says how to convert each original element into a value in the lookup for the specific key (the true/false in this case).

You could use Where and Select of course - this just feels cleaner to me.

people

See more on this question at Stackoverflow