Из LINQ в действии (стр. 76, раздел 2.6.3):
... анонимные типы [являются] отличным инструментом для быстрых и простых временных результатов. Нам не нужно объявлять классы для хранения временных результатов благодаря временным типам.
в основном они полезны для временного хранения информации в локальной области. Все, что требует большего, требует использования рефлексии и может стать настоящей проблемой. Пример, который они приводят в вышеприведенной книге, заключается в письменной форме для приведения в соответствие идентификатора, имени и объема памяти, занятого каждым запущенным процессом. Они создают анонимный тип, добавляют его в список (все одно утверждение), а затем используют ObjectDumper для его вывода. Следовательно, коду больше не нужен отдельно объявленный класс для хранения идентификатора, имени и используемой памяти, но все это объявляется неявно, уменьшая количество строк до 4:
var pl = new List<Object>();
foreach(var p in Process.GetProcesses())
pl.Add(new {p.Id, p.ProcessName, Memory=p.WorkingSet64});
ObjectDumper.Write(pl);