@OwDafuq

Почему Dictionary не видит ключ?

Добрый день.

Есть библиотека:
Dictionary<IniFormat, string> values = new Dictionary<IniFormat, string>();
class IniFormat
{
	public string Case { get; set; }
	public string Key { get; set; }
}


И есть заполнение этой самой библиотеки:
string[] lines = File.ReadAllLines(IniFilePath);

string CurrentCase = "";

lines.ToList().ForEach(x =>
{
	if (x.StartsWith("[") && x.EndsWith("]"))
	{
		CurrentCase = x.Substring(1, x.Length - 2);
	}
	else
	{
		if (!x.StartsWith("#") && x.Length > 1)
		{
			IniFormat add = new IniFormat()
			{
				Case = CurrentCase,
				Key = x.Split('=')[0]
			};
			values.Add(add, x.Split('=')[1]);
		}
	}
});


И есть "чтение" по ключу IniFormat:
public string Read(string Case, string Key)
{
	IniFormat ini = new IniFormat()
	{
		Case = Case,
		Key = Key
	};
	
	return values.ContainsKey(ini) ? values[ini] : "";
}


Суть проблемы в том, что он ни в какую не хочет видеть, что в библиотеке есть ключ.
В чем беда?

Спасибо.
  • Вопрос задан
  • 394 просмотра
Пригласить эксперта
Ответы на вопрос 4
Беда в том, что нужно читать теорию. примеры
Не задан comparer и не переопределен equals(t) и equals (gethashcode)
Словарь сортирует по умолчанию,по умолчанию все ini объекты разные, если являются разными ссылками
Ответ написан
Комментировать
@Flashmond
Студент, инженер-программист c#
Дело в том, что ключом у вас является уникальный объект. И ищется соответственно не по значению, а по ссылке. А два разных объекта не ссылаются на один участок памяти, соответственно считается, что у вас такого ключа нет. Как решение могу предложить:
а) Вложенный словарь Dictionary<string, Dictionary<string, string> >
б) Для поиска просматривать все элементы и сравнивать значение в ключе.
foreach ( IniFormat key in values.Keys )
{
if ( key.Case == Case && key.Key == Key )
  return values[key];
}
Ответ написан
GavriKos
@GavriKos
Скорее всего потому, что в данном случае ключом является уникальный инстанс IniFormat. Сравнение по значению Case и Key не проводится.
Ответ написан
Комментировать
@OwDafuq Автор вопроса
Все, понял, я тупой, IniFormat надо было сделать структурой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы