Вы можете использовать встроенные возможности группировки LINQ, которые должны быть быстрее, чем поиск содержимого. Однако, как и в случае с любым вопросом, связанным с производительностью, вы должны действительно написать код для сбора метрик производительности, прежде чем решать, как переписать код, который, как вы знаете, работает. Может оказаться, что для томов, с которыми вы будете работать, проблем с производительностью нет вообще.
Итак, вот код. Это не проверено, но что-то вроде этого должно работать:
var result = from n in numbers
from c in n.Categories
select new {Key = c, n.Value}
into x group x by x.Key into g
select g;
Каждая группа содержит ключ и последовательность значений, которые принадлежат этому ключу:
foreach( var group in result )
{
Console.WriteLine( group.Key );
foreach( var value in group )
Console.WriteLine( value );
}