Списки JSON, не удаляющие дубликаты с помощью команды Distinct - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время я запрашиваю веб-сервис, который возвращает строку JSON.

url = @"redacted url;
returnValue = new WebClient().DownloadString(url);

Я помещаю возвращаемые результаты в список элементов, определенных в классе модели. Затем я выполняю второй вызов JSON, ища другое поле с тем же поисковым термином.

url2 = @"redacted url2;
returnValue2 = new WebClient().DownloadString(url2);

Затем я создаю свои списки и объединяю списки, используя AddRange.

List<Order> shipments = JsonConvert.DeserializeObject<List<Order>>(returnValue);
List<Order> shipments2 = JsonConvert.DeserializeObject<List<Order>>(returnValue2);
shipments.AddRange(shipments2);

В результате появилось несколько дубликатов. Чтобы попытаться вернуть только уникальные записи, я использую команду Distinct при отправке в мой MVC-представление с контроллера.

return View(shipments.OrderBy(x => x.dtDateReceived).Distinct().ToList());

Но по какой-то причине он все еще возвращает дубликаты. Любые идеи о том, что я делаю не так здесь? Заранее спасибо за любую помощь!

1 Ответ

0 голосов
/ 25 апреля 2018

В итоге я исправил это, используя комментарий Шиджу выше.Я изменил Distinct на следующее.

return View(shipments.OrderBy(x => x.dtDateReceived).Distinct(new OrderComparer()).ToList());

Затем построены следующие функции сравнения

// Custom comparer for the Order class
    class OrderComparer : IEqualityComparer<Order>
    {
        // Orders are equal if their names and order numbers are equal.
        public bool Equals(Order x, Order y)
        {

            //Check whether the compared objects reference the same data.
            if (Object.ReferenceEquals(x, y)) return true;

            //Check whether any of the compared objects is null.
            if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
                return false;

            //Check whether the order's properties are equal.
            return x.sWorkOrderNumber == y.sWorkOrderNumber && x.sCustomerOrderName == y.sCustomerOrderName;
        }

        // If Equals() returns true for a pair of objects 
        // then GetHashCode() must return the same value for these objects.

        public int GetHashCode(Order order)
        {
            //Check whether the object is null
            if (Object.ReferenceEquals(order, null)) return 0;

            //Get hash code for the sCustomerOrderName field if it is not null.
            int hashOrderName = order.sCustomerOrderName == null ? 0 : order.sCustomerOrderName.GetHashCode();

            //Get hash code for the sWorkOrderNumber field.
            int hashOrderCode = order.sWorkOrderNumber.GetHashCode();

            //Calculate the hash code for the order.
            return hashOrderName ^ hashOrderCode;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...