Записать в текстовый файл построчно.

jenya7
Дата: 22.06.2014 11:11:40
Создаю объект
 class IniRecord : IComparable<IniRecord>
    {
        public string Section { get; set; }
        public List<string> KeysVals { get; set; }
        //public List<string> Keys;
        //public List<string> Values;

        public IniRecord()
        {
            KeysVals = new List<string>();
        }

        public IniRecord(string sect)
        {
            Section = sect;
            KeysVals = new List<string>();
        }

        public int CompareTo(IniRecord compare_rec)
        {
            // A null value means that this object is greater. 
            if (compare_rec == null)
                return 1;

            else
                return this.Section.CompareTo(compare_rec.Section);
        }
    }

заполняю лист объектов
  List<IniRecord> records = ini_parser.LoadIniFileToStructure();
  records.Sort();

Теперь хочу записать в текстовый файл
  File.WriteAllText(@"C:\DMP\test.ini", String.Empty);
  foreach (IniRecord rec in records)
  {
       File.AppendAllText(@"C:\DMP\test.ini", rec.Section + "\n\r");
       if (rec.KeysVals.Count > 0)
       {
           foreach (string str  in rec.KeysVals)
               File.AppendAllText(@"C:\DMP\test.ini", str + "\n\r");
       }
  }

проблема что эта па... нехороший класс записывает все в одну строку а не построчно. Перепробовал все методы - один х... результат.
Нахлобуч
Дата: 22.06.2014 11:20:56
"\r\n" или "Environment.NewLine"
jenya7
Дата: 22.06.2014 11:36:11
Нахлобуч
"\r\n" или "Environment.NewLine"


точно! спасибо!
bazile
Дата: 22.06.2014 11:43:11
jenya7, про перевод строки Нахлобуч уже ответил. Советую теперь задуматься над оптимальностью работы с файлом. Ты вызываешь в цикле File.AppendAllText() которая открывает файл, записывает данные и закрывает файл. Это крайне не оптимально. Лучше открыть файл ровно один раз.
using (FileStream fileStream = new FileStream(@"C:\DMP\test.ini", FileMode.Create, FileAccess.Write, FileShare.None))
using (StreamWriter w = new StreamWriter(fileStream))
{
	foreach (IniRecord rec in records)
	{
		w.WriteLine(rec.Section);
		if (rec.KeysVals.Count > 0)
		{
			foreach (string str  in rec.KeysVals)
			{
				w.WriteLine(str);
			}
		}
	}   
}

Также получаем полезный побочный эффект. Использование функции WriteLine() избавляет нас от забот с переводом строки.
Где-то в степи
Дата: 22.06.2014 11:45:56
Лучше прибраться через StringBuilder,
if (rec.KeysVals.Count > 0) - избыточно..,
проверку посадить выше на секцию, или секцию посадить на контракт.
jenya7
Дата: 22.06.2014 11:58:44
bazile, Где-то в степи
спасибо за подсказки, переписал.
Где-то в степи
Дата: 22.06.2014 12:01:39
фрагмент
 foreach (string str  in rec.KeysVals)

можно заменить, если скрестить Нахлобуча и Shocker.Pro :)) 16199787
StringBuilder.Append(string.Concat(string.Join(Environment.NewLine, rec.KeysVals), Environment.NewLine));
jenya7
Дата: 22.06.2014 12:11:32
Где-то в степи
фрагмент
 foreach (string str  in rec.KeysVals)

можно заменить, если скрестить Нахлобуча и Shocker.Pro :)) 16199787
StringBuilder.Append(string.Concat(string.Join(Environment.NewLine, rec.KeysVals), Environment.NewLine));


если сравнить
foreach (string str in rec.KeysVals)
    sw.WriteLine(str);

и
StringBuilder.Append(string.Concat(string.Join(Environment.NewLine, rec.KeysVals), Environment.NewLine));


то, по крайней мере визуально, второй вариант берет больше действий. :)
Где-то в степи
Дата: 22.06.2014 12:41:05
jenya7,
тут надо быть конченым циником, что бы понять всю тонкость :))
да и по всей логике предложного кода, допускается ли секция as null, допускается ли KeysVals as !Any
если нет - то надо на период разработки внести отлов - откуда прет фуфло..
если допускается, то очистить код можно
foreach (IniRecord rec in records.Where(a=>a.Section!=null&&a.KeysVals.Any()))
да и вообще, там пара ключ - значение, наверное лучше хранить все это хозяйство в словаре?
Ken@t
Дата: 22.06.2014 12:53:26
А нахуа Ini ? Что бы было как -то совместимо, других мотиваций не наблюдаю?