如何将唯一对象引用作为列表中项目的字符串

时间:2010-08-29 19:40:39

标签: c# .net silverlight windows-phone-7

我正在开发一个.NET手机应用程序,我在其中有一个显示给用户的内存中的项目列表。当用户点击用户界面中的项目时,他们将被带到第二个视图中该项目的“详细信息”视图。我目前正在我的班级中使用身份属性来引用列表中的唯一项目,但我想知道是否有更好的方法。

我正在使用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类添加一个标识列,以便可以将唯一的字符串标识传递给{{1} } 请求参数。我显示列表的用户界面控件为我提供了MappedUri事件中的基础Item对象,所以我想知道是否有一种方法可以将SelectionChanged对象与唯一“匹配”字符串值到列表中的相应引用。如果我可以提供导航服务的简单对象引用,这将很容易,但我不知道如何使用字符串值。这是Item的用途,如果是,我该如何正确使用它?

3 个答案:

答案 0 :(得分:6)

不,GetHashCode无意识别对象。

  

GetHashCode方法的默认实现不保证不同对象的唯一返回值。此外,.NET Framework不保证GetHashCode方法的默认实现,并且它返回的值在不同版本的.NET Framework之间是相同的。因此,此方法的默认实现不得用作散列目的的唯一对象标识符。

它设计用于将对象存储在存储桶中(例如在字典中),以便可以快速检索它们。两个相等对象的哈希码必须相等,但两个不同对象的哈希码不必相同。

我认为添加Id字段是一个很好的解决方案。如果您不想添加新字段只是为了给对象一个标识,您可以尝试找到一些现有字段的组合,这些字段是保证唯一标识您的对象并使用合适的分隔符来表示它们的字符串表示。请注意,分隔符不能出现在任何字段中。

答案 1 :(得分:2)

你可以使用GUID映射到列表中的每个字符串,通过调用Guid类的NewGuid方法,可以生成Guid并将其用作字符串类型via ToString方法并将其用于散列字符串。

答案 2 :(得分:2)

您肯定想要提供商品的ID。请记住,您的应用程序可能是tombstoned,因此当您尝试导航到该页面时,该对象可能甚至不再存在于内存中。您需要能够将应用程序还原到页面,而不包含URL以及任何已序列化为临时或永久存储的信息(通常在OnNavigateFrom中)。

使用GetHashCode()不仅不能保证唯一性,而且也不太可能在新恢复的应用程序方面起作用。当你试图显示某些你没有真正得到 ID的东西的细节时,生活会变得更加困难......但听起来你并没有真正处于那个位置。

因为看起来你得到了 ID,使用作为ID。你为什么要用别的东西?如果您拥有ID但可以轻松添加ID,请执行此操作。您想要一种唯一识别对象的方法......这正是ID的用途。