2011-08-22 95 views
1

我存储在强项目类型IDictionary<TKey, TValue>的字符串表示这样的数值也表示关键:如何提取密钥对象

public class MyObject 
    { 

     public string Name { get; private set; } 
     public SectionId Section { get; private set; } 

     public MyObject(SectionId section, string name) 
     { 
      Section = section; 
      Name = name; 
     } 
     public override bool Equals(object obj) 
     { 
      if (ReferenceEquals(null, obj)) return false; 
      if (ReferenceEquals(this, obj)) return true; 
      if (obj.GetType() != typeof(MyObject)) return false; 
      return Equals((MyObject)obj); 
     } 

     public override int GetHashCode() 
     { 
      unchecked 
      { 
       return (Name.ToLower().GetHashCode() * 397)^Section.GetHashCode(); 
      } 
     } 

    } 

在我的表现层,我需要通过这本词典迭代,将每个项目添加到ListBox控件。我很难搞清楚如何将MyObject(也作为关键字)转换为ListBox控件可以用作值的字符串。我是不是应该做出MyObject.GetHashCode(显式调用)是这样的:

MyListBox.Add(new ListItem(myObject.Name, myObject.GetHashCode()) 
+1

给定的MyObject与NAME =“富”和第=(有些部分ID,可以说这是一个数值3),你希望看到显示在列表框中什么? –

+0

gethashcode方法返回一个int。它在表示层中没有意义 – Baz1nga

+1

如果你的值对象也是关键字,是否有一个特定的原因,你必须使用IDictionary而不是说IEnumerable? – EtherDragon

回答

0

我应该做出明确调用MyObject.GetHashCode()

没有,GetHashCode()是:

  1. 不保证给你一个独特的价值,并
  2. 将是非常困难的反向工程来produc从一个MyObject

相反,您的每个MyObject都应该有某种唯一的标识符键。这可以是一个enum值或在你的数据库由身份列生成一个数字,或者只是一个string唯一标识每个特定MyObject,并从中你可以你正在使用的存储库检索任何集合或数据库中的MyObject

如果永远只能是一个MyObject与给定NameSection,你可能只是将二者结合起来:SectionId + ":" + Name。这样你就可以在事实之后解析出这两个值。

+0

myObject的是‘混合’的对象(不知道这是正确的术语)。myObject的可能表示有相应的数据库行的实体,或者这可能是一种非持久性/派生实体。我试图重载Equals是规避,没有任何数据库标识符将所有MyObjects存在的事实的方式有没有更好的模式在这里适用 –

+0

@Dirk:?我认为你把它变成一个ListBox的意图,使用户选择一个'MyObject',所以在PostBack上(我假设Webforms在这里 - 一个ASP.NET标记可能有帮助),你将取出这个字符串值并用它来指示我们的MyObject呃选择了。如果你只关心PostBack上的'Name'或'SectionId',那会更容易 - 只需使用'Name'或'SectionId。ToString()'作为ListItem的值。但是如果你需要更多的信息,你需要想出一个唯一标识哪个'MyObject'来获取这些信息的方法。 – StriplingWarrior