Заполнение словаря: Ключи заполняются правильно но значения не верные - C#
Формулировка задачи:
Помогите найти ошибку в коде.
Задача такая. Есть текстовый файл в котором содержится список материалов и их характеристика. Характеристика представляет собой список координат точек графика. Файл имеет такую структуру:
№0 Ст20
//start #0
0,0;0,0
0,1;0,6
...
2,2;600
2,3;1000
//end #0
№1 12X17
//start #1
0;0
0,1;1
...
0,95;12,1
1,0;14
//end #1
и так далее.
Я хочу создать словарь типа
у которого
KEY - часть строки после "№0 ", "№1 ", "№2 ", ...
Values - значения между маркерами "//start # " и "//end # " соответсвуещего ключа
реализация у меня такая:
Загружаю файл:
Ну и собственно заполнение словаря
Ключи заполняются правильно но вот значения не верные. Для каждого ключа один и тот же список координат (для последнего материала в текстовом файле).
Подскажите что не так.
Спасибо.
Dictionary<string, List<PointF>> dictionary = new Dictionary<string, List<PointF>>();
FileMaterials_arrey = System.IO.File.ReadAllLines(dir_load + @"\ResourcesFile\DB\materials.txt"); FileMaterials_list.AddRange(FileMaterials_arrey); FuncMaterials(FileMaterials_list, MaterialsDict);
private void FuncMaterials(List<string> list, Dictionary<string,List<PointF>> Dict)
{
Dictionary<string, List<PointF>> preDict = new Dictionary<string, List<PointF>>();
List<PointF> preListPoint = new List<PointF>();
List<string> preListmaterials = new List<string>();
PointF prePoint = new PointF();
int start=-1, fin=-1;
//Ищу все названия материалов
foreach (string line in list)
{
if (line.IndexOf("№") > -1)
{
preListmaterials.Add(line.Substring(3));
}
}
// Для каждого названия создаю список с координатами
for (int i = 0; i < preListmaterials.Count; i++)
{
for (int k = 0; k <= list.Count-1; k++)
{
if (list[k].IndexOf(@"//start #"+Convert.ToString(i)) > -1)
{
start = k + 1;
break;
}
}
for (int k = 0; k <= list.Count-1; k++)
{
if (list[k].IndexOf(@"//end #" + Convert.ToString(i)) > -1)
{
fin = k - 1;
break;
}
}
preListPoint.Clear();
for (int n = start; n <= fin; n++)
{
prePoint.X = (float)Convert.ToDouble(list[n].Substring(0, (list[n].IndexOf(";"))));
prePoint.Y = (float)Convert.ToDouble(list[n].Substring((list[n].IndexOf(";") + 1)));
preListPoint.Add(prePoint);
}
// Проблема тут (я так считаю)
preDict.Add(preListmaterials[i], preListPoint);
}
Dict = preDict;
}Решение задачи: «Заполнение словаря: Ключи заполняются правильно но значения не верные»
textual
Листинг программы
static void Main(string[] args)
{
Regex r = new Regex(@"№\d+\s+(?<name>[^\r\n]+)
\r?\n.+
( \r?\n(?<first>[\d,]+);(?<second>[\d,]+) )+",
RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);
var d = new Dictionary<string, List<PointF>>();
IEnumerable<Capture> A, B;
foreach (Match m in r.Matches(File.ReadAllText("test.txt")))
{
A = m.Groups["first"].Captures.Cast<Capture>();
B = m.Groups["second"].Captures.Cast<Capture>();
d.Add(
m.Groups["name"].Value,
A.Zip(B, (a, b) => new PointF(float.Parse(a.Value), float.Parse(b.Value))).ToList()
);
}
}