如何访问哈希表中的结构属性

本文关键字:结构 属性 哈希表 何访问 访问 | 更新日期: 2023-09-27 18:30:23

我有以下代码将修改结构中的属性,并且结构位于哈希表中。哈希表中的每个项目都有(Int)数据类型的键和(struct Bag)的键,这是我的代码:

struct Bag {
  string apple_type;
  string orange_type;
};
 // Make a new hashtable that will have a key of (int) data type, value of (Bag)
   public static Hashtable bags = new Hashtable();

然后我有一个方法,可以从数据库中读取行的数据,只要有一行,它就会将一个项目(bag(object))添加到哈希表中:

public void initHashtbl(){

OleDbConnection db_connector = new OleDbConnection(connection_string);
            // Open connection to oracle
            db_connector.Open();
            OleDbCommand sql_commander = new OleDbCommand(sql_statement, db_connector);
            OleDbDataReader data_Reader = sql_commander.ExecuteReader();

            // Read data from sql db server and store it in memory ...

            Bag tempBag = new Bag();
            // row counter used for list view
            int row_counter = 0;
            while (data_Reader.Read()) { // Keep reading data from memory until there is no row
      tempBag.apple_type = data_Reader[0].ToString();
      bags.Add(row_counter, tempBag);
      row_counter++;
}

   for(int bag_item=0;bag_item < bags.Count;bag_item++){
         // Get orange type value from another method that uses another sql statement from another table in db ..
     ((bag) bags[bag_item]).orange_type = getOrangeType(((bag) bags[bag_item]).apple_type);    
}
}

如果我想访问它,我以后如何访问已经在哈希表中的结构的属性?

编辑:我收到此错误:"无法修改拆箱转换的结果。"

如何访问哈希表中的结构属性

字典不允许我直接修改它

Hashtable也不会. 这与HashtableDictionary无关。 问题是,无论哪种情况,您的"值"都是值类型,因此您无法直接在集合中修改它。 如果你真的需要一个结构,那么你必须创建一个值并将其放回哈希表中:

bags.Add(1, new Bag() {apple_type="apple1",orange_type="orange1"});
//((Bag)bags[1]).apple_type="apple2";
var bag = (Bag)bags[1];
bag.apple_type = "appple2";
bags[1] = bag;

但是可变结构通常很糟糕,所以我要么第一次就获得结构的值(而不是在初始加载循环中修改它):

// row counter used for list view
int row_counter = 0;
while (data_Reader.Read()) { // Keep reading data from memory until there is no row
{
    var appleType = data_Reader[0].ToString();
    Bag tempBag = new Bag() {
        apple_type = appleType,
        orange_type = getOrangeType(appleType)
        };
    bags.Add(row_counter, tempBag);
    row_counter++;
}

或使用class.

请注意,无论您使用 Hashtable 还是 Dictionary,相同的代码的工作方式都完全相同。

此外,由于您的"键"只是一个递增的数字(并且根本不与值绑定),您也可以使用List<Bag>并按索引访问项目。

这段代码对我有用,可以读取一个项目:

        string orangeType = ((Bag) bags[0]).orange_type;

要修改一个项目,我认为您必须创建一个新的包并像这样替换现有的包:

        bags[0] = newBag;

如果您尝试在哈希表中修改包的属性,则会收到上面报告的错误。

由于值类型的工作方式,盒装 Bag 是原始包的副本,通过投射回 Bag 来"拆箱"它会创建另一个副本。从 C# 语言规范:

当值类型的值转换为类型对象时,对象 实例(也称为"框")被分配以保存值,并且 值将复制到该框中。相反,当对象引用 强制转换为值类型,检查引用的对象是否为 框,如果检查成功,则值 在框中被复制出来。

无论如何,修改副本都不会更改原始副本,因此允许它没有多大意义。

修正:

要修复您的错误并允许修改您的 HashTable of Bag,您应该将值类型更改为引用类型:

    public class Bag
    {
        public string apple_type { get; set; }
        public string orange_type { get; set; }
    };