Задать вопрос
@maxcad

C#. Поиск байтовых ключей в словаре. Что я делаю не так?

Вот пример.
byte[] bufer1 = new byte[5] { (byte)4, (byte)0, (byte)91, (byte)204, (byte)2 };
byte[] bufer2 = new byte[5] { (byte)4, (byte)0, (byte)91, (byte)204, (byte)2 };

Dictionary<byte[], string> Dict = new Dictionary<byte[], string>();

Dict.Add(bufer2, "bla bla bla");

bool test = Dict.ContainsKey(bufer1);

Console.WriteLine(Dict[bufer1]);
Console.ReadLine();


Я так понял если у массивов одинаковое содержимое, то это еще не значит, что они равны. А ключ в словаре является ссылкой на переменную bufer2.
Поэтому переменная test не true, а Console.WriteLine(Dict[bufer1]); вызывает исключение.

Я так понимаю у меня не получится вытаскивать из словаря значение по ключу если ключ не является ссылкой на переменную даже не смотря, что у них одинаковое содержимое?

Я-то хотел создать структуру хранения данных при которой можно вытаскивать строковые значения по байтовому ключу Dict[byte[]]. Но это не работает в случае если ключ - байтовый массив.
Или можно что-то сделать?
  • Вопрос задан
  • 138 просмотров
Подписаться 1 Простой 14 комментариев
Решения вопроса 1
sarapinit
@sarapinit Куратор тега C#
Точу водой камень
реализовать IEqualityComparer<byte[]> и передать в словарь при его создании
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Вот пара вариантов:
1. Преобразовывать массив в base64 строку и использовать её как ключ
2. Если размер фиксировано 5 - можно использовать (byte, byte, byte, byte ,byte) (кортеж из пяти байтов)
3. Раз уж размер всего 5 байт, то можно сделать структуру-обёртку (в которой будет 5 байтовых полей)
4. Можно хранить байты в int64
5. Можно считать хэш от байтового массива и использовать хэш как ключ.
6. В принципе можно сделать обёртку над массивом с кастомным Equals и GetHashCode.
Ответ написан
Комментировать
@maxcad Автор вопроса
Но с другой стороны у этого метода хранения данных есть другой положительный момент.

Например можно в словаре хранить несколько одинаковых ключей. Это значит одному набору данных можно присвоить несколько разных значений.
byte[] bufer1 = new byte[5] { (byte)4, (byte)0, (byte)91, (byte)204, (byte)2 };
byte[] bufer2 = new byte[5] { (byte)4, (byte)0, (byte)91, (byte)204, (byte)2 };
Dictionary<byte[], string> Dict = new Dictionary<byte[], string>();
Dict.Add(bufer1, "bla bla bla");
Dict.Add(bufer2, "tra la la");

Правда извлечение и выборку придется производить полным перебором словаря и сравнением содержимого ключей, что малость энергозатратно.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы