Вы пытаетесь проверить равную операцию HashSet<List<float>>
с другим объектом HashSet<List<float>>
.Вопрос здесь в том, почему он возвращает false ?
Теперь, прежде чем говорить о HashSet<List<float>>
, давайте поговорим о том, проверяю ли я равным (используя приведенный ниже код) для List<float>
сдругой объект List<float>
, тогда какой будет вывод?
List<float> list = new List<float>() { 10.0f, 15.0f};
List<float> anotherList = new List<float>() { 10.0f, 15.0f};
Console.WriteLine(list.Equals(anotherList));
Вывод будет
false
Так как здесьEquals
сравните ссылки объектов (которые не равны).
Теперь для решения вашей проблемы
При инициализации вы должны указать EqualityComparer
HashSet, который должен проверять тип T при необходимости.
HashSet<List<float>> HashSet1 = new HashSet<List<float>>(new FloatListComparer());
anotherHashSet1.Add(list);
HashSet<List<float>> anotherHashSet2 = new HashSet<List<float>>();
anotherHashSet2.Add(anotherList);
Console.WriteLine(anotherHashSet1.SetEquals(anotherHashSet2));
Вывод вышеприведенного кода:
true
Я написал здесь EqualityComparer
выглядит следующим образом.
public class FloatListComparer : EqualityComparer<List<float>>
{
public override bool Equals(List<float> list1, List<float> list2)
{
return list1.SequenceEqual(list2);
}
public override int GetHashCode(List<float> s)
{
return base.GetHashCode();
}
}
Теперь возникает вопрос: почему SetEquals
не работает
Если вы проверите реализацию SetEquals
на здесь , то вы обнаружите, что этовызывает метод сравнения по умолчанию для T, который работает на основе проверки ссылки на объекты.Предоставляя Comparer, SetEquals
использует указанный.
Проверьте актуальную фиддлер здесь .