如何提取关键对象的字符串表示

时间:2011-08-22 17:49:16

标签: c# asp.net dictionary equality key-value

我将项目存储在强类型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();
            }
        }

    }

在我的表示层中,我需要遍历此Dictionary,将每个项添加到ListBox控件。我很难搞清楚如何将MyObject(也可以作为键)转换为ListBox控件可以用作值的字符串。我应该像这样对MyObject.GetHashCode()进行显式调用:

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

2 个答案:

答案 0 :(得分:1)

我会想到overriding the toString method,在这里你基本上会编写代码来生成一个有意义的字符串,以便在ui中显示

希望我能正确理解你的问题。

答案 1 :(得分:0)

  

我应该只是对MyObject.GetHashCode()

进行显式调用

不,GetHashCode()是:

  1. 不保证能给您一个独特的价值,
  2. 很难进行逆向工程以生成MyObject
  3. 相反,您的每个MyObject都应该有某种唯一标识符键。这可以是enum值或由数据库中的IDENTITY列生成的数字,也可以是唯一标识每个特定string的{​​{1}},并且您可以从中MyObject检索MyObject 1}}来自您用作存储库的任何集合或数据库。

    如果只有一个MyObject只有NameSection,那么您可以将两者结合起来:SectionId + ":" + Name。这样你可以在事后解析这两个值。