Ваш пример кода может стать медленным, так как вы перебираете все записи с помощью '.Count (x => xx == i)') 52 раза (когда у вас миллионы записей, это снежки, всего с несколькими записями вы будете не замечайте много).
Что вы можете сделать, это сохранить данные в словаре:
salesBreakdownByCategory = new Dictionary<String, int[]>();
, тогда вы один раз go для всех ваших записей один раз:
foreach(var breakdown in vehicleSales)
{
int[] values;
if(!salesBreakdownByCategory.TryGetValue(vehicleSales.Category, out values))
{
values = new int[52]; // every entry in the array is by default 0
salesBreakdownByCategory[vehicleSales.Category] = values;
}
values[vehicleSales.WeekNumber-1] = vehicleSales.Value;
}
таким образом, у вас есть все данные, хранящиеся в массиве, но если вы хотите иметь список, вам нужно снова запустить структуру данных:
var result = salesBreakdownByCategory.SelectMany(x=>x.Select( (value,index) => new WeeklySalesBreakdown { WeekNumber = index+1, Value = value, Category = x.Key}));
Когда вы хотите избежать дополнительных выделение памяти и добавление данных в существующий список, вместо сохранения значения в массиве int, как в примере выше, вы можете вместо этого использовать массив bool и установить значение true для каждой найденной записи. Затем вам просто нужно перебрать словарь снова и добавить запись в ваш исходный список всякий раз, когда для bool не было установлено значение true