C #: хранение экземпляров объектов в (Hashtable) - PullRequest
1 голос
/ 02 июня 2010

Привет! Я попытался заполнить 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 ]

3 голосов
/ 02 июня 2010

HashTable просто сопоставляет ключи со значениями. Вы сопоставляете строку "1" со строкой "resCourse.CID", поэтому результаты, которые вы получаете, совершенно нормальны. Сделайте это так:

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

Теперь вы отобразите нужные значения, а не строку "resCourse.CID".

2 голосов
/ 02 июня 2010

Вы добавляете явные строки в хеш-таблицу вместо реальных идентификаторов.

Заменить две строки catalog.Add на:

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

Кавычки вокруг значений отсутствуют.

1 голос
/ 02 июня 2010

Я предполагаю, что вы на самом деле хотите хранить все объекты:

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);
    }
1 голос
/ 02 июня 2010

Удалите кавычки вокруг resCourse.CID и tauCourse.CID в ваших catalog.Add утверждениях. Вы добавляете буквенные строки, а не значение свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...