Я создаю простой словарь из reg-файла (экспорт из Windows Regedit). Файл .reg
содержит ключ в квадратных скобках, за которым следует ноль или более строк текста, за которыми следует пустая строка. Этот код создаст словарь, который мне нужен:
var a = File.ReadLines("test.reg");
var dict = new Dictionary<String, List<String>>();
foreach (var key in a) {
if (key.StartsWith("[HKEY")) {
var iter = a.GetEnumerator();
var value = new List<String>();
do {
iter.MoveNext();
value.Add(iter.Current);
} while (String.IsNullOrWhiteSpace(iter.Current) == false);
dict.Add(key, value);
}
}
Я чувствую, что есть более чистый (красивый?) способ сделать это в одном операторе Linq (используя group by
), но мне неясно, как реализовать итерацию элементов значений в список. Я подозреваю, что мог бы сделать то же самое GetEnumerator
в операторе let, но похоже, что должен быть способ реализовать это, не прибегая к явному итератору.
Образец данных:
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.msu]
@="Microsoft.System.Update.1"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.MTS]
@="WMP11.AssocFile.M2TS"
"Content Type"="video/vnd.dlna.mpeg-tts"
"PerceivedType"="video"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.MTS\OpenWithProgIds]
"WMP11.AssocFile.M2TS"=hex(0):
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.MTS\ShellEx]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.MTS\ShellEx\{BB2E617C-0920-11D1-9A0B-00C04FC2D6C1}]
@="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}"
Обновление
Извините, мне нужно уточнить. Файлы занимают около 300 МБ, поэтому я использовал подход, который я использовал, чтобы уменьшить объем памяти. Я бы предпочел подход, который не требует загрузки всего файла в память.
Aggregate
, но это не сильно отличается - person Gilad Green   schedule 11.10.2017[..]
в качестве ключа, а все остальное до разделительного пробела в качестве значения, верно? - person JuanR   schedule 11.10.2017