【问题标题】:C#: Storing Instance of Objects in (Hashtable)C#:在(哈希表)中存储对象的实例
【发布时间】:2011-02-27 00:11:02
【问题描述】:

您好,我尝试通过以下方式填充 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

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

【问题讨论】:

  • 您正在向哈希表中添加字符串,您必须在其中添加对象。只需从 .Add 方法调用的第二个参数中删除引号 :)

标签: c# .net hashtable


【解决方案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);
    }

【讨论】:

  • 它将帮助像我这样正在学习编程的其他人
  • 您确定您的两个子类(ResearchCourse 和 TaughtCourse)都继承自 CourseBase?您的 CourseBase 定义是否包含 CID 作为属性?
  • 我确实有继承自课程父类的子类。但是 Visual C# 在 CID 下划线并给出了错误。我调试了,错误消失了,不知道怎么回事。但是,您提供的代码似乎正在运行。感谢您的帮助!
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的解释:)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    将两行catalog.Add 替换为:

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

    值周围没有引号。

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2021-06-27
      • 2012-01-06
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多