Заполнение словаря: Ключи заполняются правильно но значения не верные - 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 и так далее. Я хочу создать словарь типа
Dictionary<string, List<PointF>> dictionary = new Dictionary<string, List<PointF>>();
у которого KEY - часть строки после "№0 ", "№1 ", "№2 ", ... Values - значения между маркерами "//start # " и "//end # " соответсвуещего ключа реализация у меня такая: Загружаю файл:
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()
            );
    }
 
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.455 из 5
Похожие ответы