Исключение при чтении данных из файла в словарь
Делаю словарь-поисковик. Есть текстовый файл, в каждой его строке есть первое слово, становящееся ключом к каждому новому элементу класса dictionary и через слэш - содержание элемента.
Пример текста:
Аббат/1. Настоятель мужского католического монастыря. 2.Католический священнослужитель. II прил. аббатский, -ая,-ое.(все в одной строке)
КОД
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace КУРСОВАЯ
{
public partial class Form1 : Form
{
Dictionary<string, string> myDictionary = new Dictionary<string, string>();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
StreamReader myReader = new StreamReader(@"C:/Users/user/Desktop/Словарь.txt");
string line;
string[] subs;
line = myReader.ReadLine();
while (line != null)
{
subs = line.Split('/');
myDictionary.Add(subs[0], subs[1]);
line = myReader.ReadLine();
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string word = Convert.ToString(textBox1.Text);
word = word.ToUpper();
if (myDictionary.ContainsKey(word) == true)
{
textBox2.Text = "";
textBox2.Text +=Environment.NewLine + word + " - " + myDictionary[word];
}
else
{
textBox2.Text = "";
textBox2.Text += Environment.NewLine + " Нет такого слова в словаре" ;
}
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
private void label2_Click(object sender, EventArgs e)
{
}
}
}
Проблема в 33 строке, появляется исключение, гласящее, что индекс находится вне границ, хотя когда я объявлял все сразу, но без while, программа работала
Текст исключения: System.IndexOutOfRangeException: "Индекс находился вне границ массива."
Ответы (1 шт):
Предлагаю чуток подправить ваш код по загрузке данных в словарь:
static void LoadWordsToDictionaryByTextFile(ref Dictionary<string, WordMap> dic, string filePath)
{
foreach (var line in File.ReadAllLines(filePath))
{
var subs = line.Split('/');
if (subs.Length <= 1)
continue;
var wordMap = new WordMap(subs[0], subs[1]);
dic.Add(wordMap.Word, wordMap);
}
}
Поиск по словарю:
static WordMap TryGetWordMapByWord(Dictionary<string, WordMap> dic, string word) =>
dic.FirstOrDefault(x => x.Key.Equals(word)).Value;
Класс WordMap:
internal class WordMap
{
public string Word { get; }
public string WordMeanings { get; }
public WordMap(string word, string wordMeanings)
{
Word = word;
WordMeanings = wordMeanings;
}
}
Использовать следующим образом:
Dictionary<string, WordMap> wordsDictionary = new();
string filePath = string.Concat(Directory.GetCurrentDirectory(), @"\dictionary.txt");
LoadWordsToDictionaryByTextFile(ref wordsDictionary, filePath);
Данные в текстовом файле:
Аббат/1. Настоятель мужского католического монастыря. 2.Католический священнослужитель. II прил. аббатский, -ая,-ое.(все в одной строке)
Какое-то слово/1. Какое-то другое определение
Данные в словаре лучше хранить в виде класса, а не просто строки. Вообще, старайтесь всегда отстраняться от базовых типов и приходить к классам. Даже, если в классе у вас будет всего-лишь одно свойство - читаемость кода в таком случае в разы увеличится. Никто не будет вас ругать за ещё один класс с 5 строками кода