C#:在(Hashtable)中存储对象的实例

时间:2010-06-02 19:33:51

标签: c# .net hashtable

您好我尝试按以下方式填写Hashtable:

      ResearchCourse resCourse= new ResearchCourse();//Class Instance
      resCourse.CID="RC1000";
      resCourse.CName="Rocket Science";

      TaughtCourse tauCourse= new TaughtCourse();//Class Instance
      tauCourse.CID="TC1000";
      tauCourse.CName="Marketing";

      Hashtable catalog = new Hashtable();

        catalog.Add("1", "resCourse.CID");
        catalog.Add("2", "tauCourse.CID");


        foreach (DictionaryEntry de in catalog)
        {
            Console.WriteLine("{0}, {1}", de.Key, de.Value);
        }

输出结果到控制台是:

1,resCourse.CID
2,tauCourse.CID

预期结果为:

1,RC1000
2,TC2000

我对Hashtables的误解是什么? Hashtable存储类实例及其值的简单方法是什么?

4 个答案:

答案 0 :(得分:3)

HashTable只是将键映射到值。您将字符串"1"映射到字符串"resCourse.CID",这样您获得的结果就完全正常了。这样做是这样的:

catalog.Add("1", resCourse.CID);
catalog.Add("2", tauCourse.CID);

现在,您将映射所需的实际值,而不是字符串"resCourse.CID"

答案 1 :(得分:2)

您正在向哈希表添加显式字符串,而不是实际ID。

将两条catalog.Add行替换为:

catalog.Add("1", resCourse.CID);
catalog.Add("2", tauCourse.CID);

值周围没有引号。

答案 2 :(得分:1)

删除resCourse.CID语句中tauCourse.CIDcatalog.Add周围的引号。您要添加文字字符串,而不是属性的值。

答案 3 :(得分:1)

我假设您实际上想要存储整个对象:

catalog.Add("1", resCourse);
catalog.Add("2", tauCourse);

当然,一旦你去那里,你将需要有一个共同的基类(或接口)来导出你的两个课程,以便访问这些值:

public abstract class CourseBase {
   public string CID { get; set; }
   public string CName{ get; set; }
}

public class ResearchCourse : CourseBase { }
public class TaughtCourse : CourseBase { }

然后你可以像这样存储/访问:

Hashtable catalog = new Hashtable();
catalog.Add("1", resCourse);
catalog.Add("2", tauCourse);

foreach (DictionaryEntry de in catalog) 
{
   Console.WriteLine("{0}, {1}", de.Key, ((CourseBase)de.Value).CID);
}

或者更好的是,使用通用词典:

    var resCourse = new ResearchCourse() { CID = "RC1000", CName = "Rocket Science" };
    var tauCourse = new ResearchCourse() { CID = "TC1000", CName = "Marketing" };

    var catalog = new Dictionary<string, CourseBase>();
    catalog.Add("1", resCourse);
    catalog.Add("2", tauCourse);

    foreach (string key in catalog.Keys)
    {
        Console.WriteLine("{0}, {1}", key, catalog[key].CID);
    }