2015-09-09 7 views
1

Я пытаюсь сохранить словарь в txt-файле, и я ищу простые примеры. Можете ли вы мне помочь, пожалуйста? Я пробую это, но это не работает для меня. Спасибо.C# как сохранить словарь в текстовый файл

Dictionary<string, int> set_names = new Dictionary<string, int>(); 
     //fill dictionary 
     //then do: 
     StringBuilder sb =new StringBuilder(); 
     foreach (KeyValuePair<string, int> kvp in set_names) 
     { 
      sb.AppendLine(string.Format("{0};{1}", kvp.Key, kvp.Value)); 
     } 

     string filePath = @"C:\myfile.txt"; 
     using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate)) 
     { 
      using (TextWriter tw = new StreamWriter(fs)) 
+0

Проверьте ['File.WriteAllText'] (https://msdn.microsoft.com/en-us/library/ms143375 (v = vs.110) .aspx). – juharr

+0

@juharr: для этого требуется, чтобы словарь был полностью сохранен в ОЗУ. Не проблема для небольших объемов данных, но не для решения одного размера. –

+0

@EricJ. Он уже хранится в ОЗУ в примере с помощью 'StringBuilder'. Также с небольшим Linq вы можете использовать 'File.WriteAllLines' вместо этого, не требуя, чтобы забивать RAM. – juharr

ответ

2

Вы пишете содержимое словаря в sb, но никогда не использовать его. Нет необходимости сначала создавать копию в памяти вашего словаря (StringBuilder). Вместо этого просто напишите это, когда вы перечислите словарь.

string filePath = @"C:\myfile.txt"; 
using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate)) 
{ 
    using (TextWriter tw = new StreamWriter(fs)) 

    foreach (KeyValuePair<string, int> kvp in set_names) 
    { 
     tw.WriteLine(string.Format("{0};{1}", kvp.Key, kvp.Value)); 
    } 
} 
0

Использование:

StreamWriter sw = new StreamWriter(YOUFILEPATHSTRING); 
try 
{ 
foreach(KeyValuePair kvp in set_names) 
{ 
    sw.WriteLine(kvp.Key +";"+kvp.Value; 
} 

sw.Close(); 
} 

catch (IOException ex) 
{ 
sw.Close(); 
} 

Этот код создания потока указывает на файл, который вы пишете, перебирает пары значение ключа и записать их по одному к файлу. Поток должен быть закрыт в случае успешного завершения или если исключение IO поймано, иначе файл все равно может быть открыт процессом.

+1

Если выбрано исключение, вы никогда не закроете поток, оставив файл заблокированным. –

+0

Ну, дескриптор файла в конечном итоге будет выпущен, даже если будет выбрано исключение. Когда это произойдет, это будет зависеть от того, когда GC запустится или когда программа выйдет (что будет на первом месте). Это может быть в течение 5 секунд, но также может быть через 5 месяцев ... – elgonzo

+0

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. – NathanOliver

3

Вы можете сделать это с File.WriteAllLines и некоторые Linq

File.WriteAllLines(
    path, 
    dictionary.Select(kvp => string.Format("{0};{1}", kvp.Key, kvp.Value)); 

Заметим, что это будет записывать в файл, как он перебирает словаря, таким образом, не используя какой-либо дополнительной памяти.

+0

Также хороший подход. –

+1

Примечание. Если целевой файл уже существует, он перезаписывается. «Это то же поведение, что и OP с текущим« FileMode.OpenOrCreate ». Просто то, что нужно знать. –

Смежные вопросы