Jeer
@Jeer
уверенный пользователь

Как правильно сравнивать record-ы с byte[] внутри?

Привет,
В c# 10 появились типы record, которые еще могут быть и struct. Их удобно использовать потому, что внутри уже встроен компаратор и не надо дописывать своего. Но я не до конца понимаю, как это работает, с примитивными стрингами всё норм, а вот, например, если передать byte[], то сравнивать не хочет, объясните, пожаулйста
private record struct TypeEncoding(byte[] contentType, byte[] contentEncoding);
...

var k1 = new TypeEncoding(new byte[]{1,2,3}, new byte[]{4,5});
var k2 = new TypeEncoding(new byte[]{1,2,3}, new byte[]{4,5});

var kk = k1 == k2; // false, хотя я ожидаю true

И что надо сделать, чтобы сравнивало по значению?
  • Вопрос задан
  • 64 просмотра
Решения вопроса 2
vabka
@vabka Куратор тега C#
Токсичный шарпист
если передать byte[], то сравнивать не хочет, объясните, пожаулйста

Потому что компилятор генерирует вот такое:
EqualityComparer<byte[]>.Default.Equals(<x>k__BackingField, other.<x>k__BackingField);

Если тебе нужно сравнение по содержимому массивов - тебе придётся самостоятельно определить метод с вот такой сигнатурой:
public virtual bool Equals(TypeEncoding other) {
  // код сравнения this с other
}

А также тебе придётся переопределить GetHashCode, чтобы он на одинаковых массивах отдавал одинаковое число.

Но тут есть нюанс - GetHashCode не должен зависеть от изменяемых типов/полей. Тоесть тебе по хорошему нельзя будет менять содержимое этих массивов, а то можешь получить неприятные спецэффекты, если hashcode поменяется.
Ответ написан
onyxmaster
@onyxmaster
Программист, ненастоящий сисадмин
Я соглашусь с Василием, но дополню что можно завернуть byte[] в какой-то тип, который содержит только одно значение (известно в разных языках как newtype или domain), и будет реализовывать `IEquatable<>`.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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