Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 2
Регистрация: 21.10.2009
Сообщений: 51

BackgroundWorker запись данных в Dictionary

17.11.2014, 17:51. Показов 897. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо реализовать метод,который асинхронно будет парсить текст и создавать словарь из слов этого текста.На форме прогресс работы должен отмечаться с помощью ProgressBar
Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions;
 
namespace WindowsFormsApplication8
{
    public partial class Form1 : Form
    {
        public string[] docs;
        BackgroundWorker worker;
        public Form1()
        {
            InitializeComponent();
            worker = new BackgroundWorker();
            worker.WorkerReportsProgress = true;
            worker.DoWork += GetVocabulary;
            worker.ProgressChanged += OnProgressChanged;
        }
        private void OnProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = Math.Min(e.ProgressPercentage, 100);
        }
        private string path ="";
        private void button1_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.ShowDialog();
            string path = folderBrowserDialog1.SelectedPath;
            docs = Directory.GetFiles(path);
            worker.RunWorkerAsync(docs);
        }
          //Create a vocabulary of terms from parsed text
        public static void GetVocabulary(object sender,DoWorkEventArgs e)
        {
            List<Dictionary<string, int>> docsOccurences = new List<Dictionary<string, int>>();
            StreamReader reader=null;
            string text = "";
            int amount = 0;
            List<string> tokenizedText = new List<string>(); 
            List<string> fullTexts = new List<string>();
            List<string[]> splittedText = new List<string[]>();
            string source="";
            string pattern="";
            Dictionary<string, int> occurences = new Dictionary<string, int>();
            string[] extracted = (string[])e.Argument;
            //read all from files
           foreach (string path in extracted)
            {
                reader = new StreamReader(path,Encoding.GetEncoding(1251));
                text = reader.ReadToEnd();
                fullTexts.Add(text);
            }
            reader.Close();
            foreach (string tokenizeText in fullTexts)
            {
                tokenizedText.Add(Range.ConvertStringArrayToString(Range.Tokenize(tokenizeText)));
            }
 
            foreach (string textToSplit in tokenizedText)
            {
               splittedText.Add(textToSplit.Split(' '));
            }
           foreach (string[] str in splittedText)
            {
                source = Range.ConvertStringArrayToString(str);
              for(int i=0;i<str.Length;i++)
              {
                  pattern = str[i];
                  if (!occurences.ContainsKey(pattern) && !StopWords.stopWordsList.Contains(pattern.ToLower()))
                  {
                     
                          amount = new Regex(pattern).Matches(source).Count;
                          occurences.Add(pattern, amount);
                  }
                  ((BackgroundWorker)sender).ReportProgress(i* 100/str.Length);
              }
              docsOccurences.Add(occurences);
              occurences.Clear();
              
            }
           Range.calculateTF(docsOccurences);
        }
       
    }
}
Проблема в том,что при добавлении occurences в docsOccurences записывается 2 раза одно и то же значение.Хотя occurences содержит нужные значения,но на следующей итерации во время добавления в docsOccurences предыдущее значение становится таким же,как и текущее.Подскажите как исправить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2014, 17:51
Ответы с готовыми решениями:

Запись из Scripting.Dictionary в столбец
Доброго дня всем .... В столбце &quot;А &quot;150 000 элементов. Записываю их в словарь. Затем пробую вывести в столбец В: Sub MMM() Set...

Запись в файл и чтение из файла Dictionary(Of T, V)
Привет народ подскажите пожалуйста как можно записать в фаил.txt, Dictionary(Of T, V) формата (22.10.2018, &quot;44444444444&quot;) и...

Парсинг строк key=value и запись в Dictionary
Здравствуйте, форумчане. Перейду к сути, есть массив строк такого вида: &quot;asdasd=qwdasfd&quot;. Мне нужно, каждый элемент массива разделить...

1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
18.11.2014, 00:39
Vasi, в строке №84 ты добавляешь элемент в список - docsOccurences.Add(occurences) и затем очищаешь occurences для дальнейшей работы. Т.к. occurences это переменная ссылочного типа и создается она один раз, то по сути ты добавляешь в docsOccurences одно и тоже значение. Чтобы понять что происходит подумай чем отличаются следующие примеры:
Пример №1
C#
1
2
3
4
5
6
7
8
9
List<Dictionary<string, int>> docsOccurences = new List<Dictionary<string, int>>();
Dictionary<string, int> occurences = new Dictionary<string, int>();
for (int i=0; i<5; i++)
{
    occurences.Add("aaa", 1); occurences.Add("bbb", 2); occurences.Add("ccc", 3);
    
    docsOccurences.Add(occurences);
    occurences.Clear();
}

Пример №2
C#
1
2
3
4
5
6
7
8
List<Dictionary<string, int>> docsOccurences = new List<Dictionary<string, int>>();
for (int i=0; i<5; i++)
{
    Dictionary<string, int> occurences = new Dictionary<string, int>();
    occurences.Add("aaa", 1); occurences.Add("bbb", 2); occurences.Add("ccc", 3);
    
    docsOccurences.Add(occurences);
}

Поняв это ты легко исправишь ошибку. Собственно примере №2 содержит исправление

P.S. Не могу оставить без внимания некорректный код работы с потоками:
C#
1
2
3
4
5
6
7
8
StreamReader reader = null;
foreach (string path in extracted)
{
    reader = new StreamReader(path, Encoding.GetEncoding(1251));
    text = reader.ReadToEnd();
    fullTexts.Add(text);
}
reader.Close();
Такой код явно закрывает только последний открытый файл. Остальные будут закрыты сборщиком мусора (путем вызова Finalize) или при завершении приложения. Код следует переписать так:
C#
1
2
3
4
5
6
7
8
foreach (string path in extracted)
{
    using (StreamReader reader = new StreamReader(path, Encoding.GetEncoding(1251)))
    {
        text = reader.ReadToEnd();
        fullTexts.Add(text);
    }
}
Или так:
C#
1
2
3
4
foreach (string path in extracted)
{
    fullTexts.Add(File.ReadAllText(path, Encoding.GetEncoding(1251)));
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2014, 00:39
Помогаю со студенческими работами здесь

Обработка данных в нескольких BackgroundWorker
Друзья, приветствую! Задача: есть коллекция, в которой хранятся артикулы товаров, есть процедура которая по артикулу ищет описание...

Некорректная передача данных на COM порт с BackgroundWorker
Доброе время. Возникла одна проблема: Для передачи данных на COM порт попробовал использовать backgroundWorker, backgroundWorker...

Обновление данных в Datagridview из БД при использовании BackgroundWorker
Решил попробовать при обращении к базе использовать информационное окошко с текстом &quot;Выполняется запрос&quot; и прогрессбаром. Есть...

Загрузка база данных через progressbar(BackgroundWorker)
Привет всем форумчане! У меня такая проблема, я создал программа с база данных MYSQL server. Когда я хочу искат данные программа...

Проинициализировать значениями dictionary вложенный в dictionary
Народ, помогите, как проинициализировать значениями такую конструкцию: Dictionary &lt;int,Dictionary&lt;string, int&gt;&gt;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru