Как получить уникальную ссылку на объект в виде строки для элементов в списке - PullRequest
1 голос
/ 29 августа 2010

Я работаю над приложением для телефона .NET, где у меня есть список элементов в памяти, которые отображаются для пользователя. Когда пользователь нажимает на элемент в пользовательском интерфейсе, он будет переведен в представление «подробности» для этого элемента во втором представлении. В настоящее время я использую свойство identity в своем классе для ссылки на уникальные элементы в списке, но мне интересно, есть ли лучший способ.

Я использую System.Windows.Navigation для настройки UriMappings примерно так:

<nav:UriMapping Uri="/Items/{itemId}" 
                MappedUri="/Views/Items.xaml?itemId={itemID}" />

Затем я использую NavigationService для навигации следующим образом:

NavigationService.Navigate(new Uri("/Items/" + item.id.ToString(),
                                   UriKind.Relative));

Все это прекрасно работает, но я не знаю, что мне нравится включать столбец идентификаторов для моего Item класса, чтобы иметь уникальный идентификатор строки для передачи в строку запроса MappedUri. Мой элемент управления пользовательского интерфейса, который показывает список, дает мне базовый объект Item в событии SelectionChanged, поэтому мне интересно, есть ли способ «сопоставить» этот объект Item с уникальным строковым значением с соответствующей ссылкой в списке. Если бы я мог предоставить простую ссылку на объект для службы навигации, это было бы легко, но я не уверен, как это сделать со строковым значением. Для этого ли GetHashCode(), и если да, то как мне правильно его использовать?

Ответы [ 3 ]

6 голосов
/ 29 августа 2010

Нет, GetHashCode не предназначен для уникальной идентификации объектов.

Реализация по умолчанию метода GetHashCode не гарантирует уникальные возвращаемые значения для различных объектов. Кроме того, .NET Framework не гарантирует реализацию по умолчанию метода GetHashCode, и возвращаемое значение будет одинаковым для разных версий .NET Framework. Следовательно, реализация по умолчанию этого метода не должна использоваться в качестве уникального идентификатора объекта для целей хеширования.

Он предназначен для хранения объектов в контейнерах (например, в словаре), чтобы их можно было быстро найти. Хеш-коды для двух одинаковых объектов должны быть равны, но хеш-коды для двух разных объектов не должны быть разными.

Я думаю, что добавление поля Id является хорошим решением. Если вам не нравится добавлять новое поле просто для придания объекту идентичности, вы можете попытаться найти некоторую комбинацию существующих полей, которая гарантированно уникально идентифицирует ваш объект и объединит их строковые представления с подходящим разделителем. Будьте внимательны, чтобы разделитель не встречался ни в одном из полей.

2 голосов
/ 29 августа 2010

Вы определенно хотите указать ID товара.Имейте в виду, что ваше приложение может быть захоронено , поэтому объект может даже не находиться в памяти, когда вы пытаетесь перейти на эту страницу.Вы должны иметь возможность восстановить приложение на странице без какой-либо информации, кроме URL и того, что было сериализовано во временное или постоянное хранилище (обычно в OnNavigateFrom).

Использование GetHashCode() для этого не тольконе гарантирует уникальность, но крайне маловероятно, что она будет работать и с недавно восстановленным приложением.Жизнь становится намного сложнее, когда вы пытаетесь отобразить детали чего-то, где вы на самом деле не получили удостоверение личности ... но не похоже, что вы действительно находитесь в таком положении.

Похоже, у вас есть идентификатор, используйте в качестве идентификатора.Почему вы хотите использовать что-нибудь еще?Если у вас нет идентификатора, но вы можете легко добавить его, сделайте это.Вам нужен способ уникальной идентификации объекта ... это именно то, для чего нужен идентификатор.

2 голосов
/ 29 августа 2010

Существует GUID , который можно использовать для сопоставления с каждой строкой в ​​списке, вызывая метод NewGuid класса Guid, можно сгенерировать Guid и использовать его в качестве типа строки с помощьюToString метод и использовать его для хеширования строк.

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