Я ищу встроенные альтернативы HashSet
и Dictionary
объектов, которые имеют лучшую производительность, чем списки, но не используют внутренний метод GetHashCode
. Мне это нужно, потому что в классе я написал, что нет никакого способа написания GetHashCode
метод, который выполняет обычный контракт с Equals
кромеC# перманентные альтернативы HashSet и словарь, которые не используют GetHashCode
public override int GetHashCode() { return 0; } // or return any other constant value
, который превратит HashSet
и Dictionary
в обычные списки (производительность мудрая) ,
Так что мне нужна реализация набора и реализация отображения. Какие-либо предложения?
EDIT:
Мой класс является допуск на основе 3-мерный вектор класс:
public class Vector
{
private static const double TOL = 1E-10;
private double x, y, z;
public Vector(double x, double y, double z)
{
this.x = x; this.y = y; this.z = z;
}
public override bool Equals(object o)
{
Vector other = o as Vector;
if (other == null)
return false;
return ((Math.Abs(x - other.x) <= TOL) &&
(Math.Abs(y - other.y) <= TOL) &&
(Math.Abs(z - other.z) <= TOL));
}
}
Обратите внимание, что мой Equals
метод не является транзитивным. Однако в моем случае я могу сделать его «локально» транзитивным, потому что в какой-то момент я узнаю все векторы, которые мне нужно поместить в набор set/mapping, и я также знаю, что они появятся в кластерах. Поэтому, когда я собрал все векторы, я выберу одного представителя для каждого кластера и заменит все оригинальные векторы представителем. Затем Equals
будет транзитивным среди элементов моего набора набора/набора карт.
Когда у меня есть мой набор или сопоставление, я буду собирать векторы из другого источника (для этого вопроса давайте предположим, что я попрошу пользователя ввести вектор). Это может быть любой возможный вектор. Они никогда не будут добавлены в набор/сопоставление, но мне нужно будет знать, содержатся ли они в наборе/наборе ключей отображения (относительно толерантности), и мне нужно будет узнать их значение из сопоставления.
Вам потребуется предоставить дополнительную информацию об объекте. Почему вы не можете создать хеш для этого? Что вы можете сообщить об этом? Как вы сравниваете объекты для равенства и т. Д. – Servy
'SortedSet' и' SortedDictionary' –
@IvanStoev Предполагается, что объекты имеют согласованное полное упорядочение. – Servy