Вам не нужно пытаться все связать. Когда вы создаете группу, вы создаете из всех данных в списке словарь, прежде чем вы сможете записать одну строку в вывод. Это потребляет как минимум вдвое больше памяти, чем необходимо.
Такая конструкция исключает ленивую обработку, поскольку вы с нетерпением читаете все в память, прежде чем сможете записать вывод.
Вместо этого вы можете обработать список один за другим и записать текущую строку в нужный файл. Это может быть так же просто, как поиск в хеш-таблице для правильного потока файлов, используя Animal или Bird в качестве ключей для выбора правильного выходного файла.
static Dictionary<string, StreamWriter> _FileMap = new Dictionary<string, StreamWriter>();
static void Main(string[] args)
{
var data = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("Animal", "Lion|Roars"),
new KeyValuePair<string, string>("Animal", "Tiger|Roars"),
new KeyValuePair<string, string>("Bird", "Eagle|Flies"),
new KeyValuePair<string, string>("Bird", "Parrot|Mimics")
};
foreach (var line in data) // write data to right output file
{
WriteLine(line.Key, line.Value);
}
foreach (var stream in _FileMap) // close all open files
{
stream.Value.Close();
}
}
static void WriteLine(string key, string line)
{
StreamWriter writer = null;
if (false == _FileMap.TryGetValue(key, out writer))
{
// Create file if it was not opened already
writer = new StreamWriter(File.Create(key+".txt"));
_FileMap.Add(key,writer);
}
writer.WriteLine(line); // write dynamically to the right output file depending on passed key
}