今天使用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
返回的是所有值的集合,不是单个值