Ваше текущее решение в порядке; LINQ не идеальный выбор для таких запросов с отслеживанием состояния.
Вот решение чисто LINQ; это не идеально, потому что это немного загадочно и имеет квадратичную сложность, но функционально эквивалентно:
return flatSource.Select((item, index) =>
new SubregionWithRegion
{
Region = flatSource.Take(index + 1)
.LastOrDefault(SomeRegionDictionary.ContainsKey) ?? "",
SubRegion = item
})
.Where(srwr => !SomeRegionDictionary.ContainsKey(srwr.SubRegion));
Состояние цикла с состоянием обрабатывается запросами Take
+ LastOrDefault
, а сложное условие else
обрабатывается заключительным предложением Where
.