C # HashSet не содержит только уникальные объекты этого типа.Зачем? - PullRequest
0 голосов
/ 25 июня 2019

Это мой класс.

public class Report
{
    public string Name { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
    public string Lat { get; set; }
    public string Long { get; set; }
    public string Type { get; set; }
    public DateTime CreateDate { get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;
        var y = obj as Report;

        if (y == null)
            return false;

        return
            this.Name == y.Name &&
            this.Long == y.Long &&
            this.Lat == y.Lat;
    }

    public override int GetHashCode()
    {
        return (this.Name + this.Long + this.Lat).GetHashCode();
    }
}

Итак, это мой код и какие-то неуникальные значения появляются, когда я создаю новый HashSet? Есть идеи? Похоже, мой пост в основном состоит из кода, поэтому мне нужно добавить больше деталей.

Я создаю объекты, переданные в HashSet с помощью этого метода (это консольное приложение, созданное только для целей тестирования, ничего особенного)

static Report CreateReport(dynamic report)
        {
            var result = new Report();

            result.City = report.city.ToString();
            result.Name = report.name.ToString();
            result.Country = report.country.ToString();
            result.Long = report.@long.ToString();
            result.Lat = report.lat.ToString();
            result.Type = report.type.ToString();
            result.CreateDate = DateTime.Now;

            return result;
        }

1 Ответ

0 голосов
/ 25 июня 2019

Вы пытались использовать IEqualityComparer<T>, где T равно Report?

public class ReportComparer : IEqualityComparer<Report>
{
    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;
        var y = obj as Report;

        if (y == null)
            return false;

        return
            this.Name == y.Name &&
            this.Long == y.Long &&
            this.Lat == y.Lat;
    }

    public int GetHashCode(Report obj)
    {
        return (this.Name + this.Long + this.Lat).GetHashCode();
    }
}

А затем создайте экземпляр вашего HashSet:

HashSet<Report> reports = new HashSet<Report>(new ReportComparer())

Документация:

MSDN EqualityComparer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...