今天使用hashtable的时候出现了一些问题,网上没找到合适的答案所以解决后分享一篇

比如我创建一个商品类,再创建商店里面存放商品的数据,然后通过foreach遍历商品的属性

public class Shangping
{
    public int number { get; set; }
    public string name { get; set; }
    public int price { get; set; }

    public Shangping(int number, string name, int price)
    {
        this.number = number;
        this.name = name;
        this.price = price;
    }
}

现在创建一个商店类用hashtable存放来添加我需要的商品

   public class Shangdian
   {
       public Hashtable product = new Hashtable();
       public void Add(int number, string name, int price)
       {
           product.Add(number, new Shangping(number,name,price));
       }
   }

在主函数里面添加商品

 Shangdian shangdian = new Shangdian();
 shangdian.Add(1,"牛奶",10);
 shangdian.Add(2, "薯片", 20);

此时当你想要遍历这个hashtable的时候就出现问题了

如果你的hashtable是一个键对应一个值的话就能正常输出

比如你的hashtable是这样创建的:product.Add(10,"汉堡");

你使用foreach遍历他的时候可以直接遍历它

   foreach (var item in product)
   {

       Console.WriteLine($"商品为:{item}");
   }

但是如果你用这个遍历一开始我们创建的hashtable的时候就会出现

可以看到由于我们的键值为一个类不能像这样遍历

我们需要进行类型转化,比如我们的键值为一个类,那我们就需要先转为这个类,再进行属性的访问

foreach (DictionaryEntry entry in product)
{
    
    Console.WriteLine($"键: {((int)(entry.Key))}, 对应值: 名字为{((Shangping)entry.Value).name},价格为{((Shangping)(entry.Value)).price}");
}       

分开写就是

foreach (DictionaryEntry entry in product)
{
    int keys = (int)entry.Key;
    Shangping A = (Shangping)entry.Value;
    Console.WriteLine($"键: {keys}, 对应值: 名字为{A.name}");
}

可以看到,当foreach要遍历一个类的属性时候,我们需要进行类型的转换因为

  • foreach遍历Hashtable时返回的是DictionaryEntry对象,不是直接的键

  • product.Values返回的是所有值的集合,不是单个值

更多推荐