Выглядит на мой скромный взгляд не плохо.
Разве что меня смутил момент, где у тебя 4 вложенных foreach что говорит о сложности алгоритма О(n^4)
На счет этого. Мой внутренний детектор говнокода, говорит, что это было бы не плохо вынести в переменную отдельную, а так же LINQ оформлять по условию, новое обращение с новой строки. Вроде случая 2. А так же переменная бы говорила, что именно там хранится и что мы хотели достать.