有没有更好的方法将哈希表转换为数据表
private DataTable ConvertHastTableToDataTable(System.Collections.Hashtable hashtable)
{
var dataTable = new DataTable(hashtable.GetType().Name);
dataTable.Columns.Add("Key",typeof(object));
dataTable.Columns.Add("Value", typeof(object));
IDictionaryEnumerator enumerator = hashtable.GetEnumerator();
while (enumerator.MoveNext())
{
dataTable.Rows.Add(enumerator.Key, enumerator.Value);
}
return dataTable;
}
答案 0 :(得分:5)
这是一种非常简单的方法。但是,在这种特殊情况下的真正惯用方法是直接使用foreach
构造。
foreach (DictionaryEntry item in hashtable)
{
// work with item.Key and item.Value here
}
对于将来的编程,您可能希望继续使用Dictionary<TKey, TValue>
集合,这样可以比传统的非泛型Hashtable
更强大的输入。例如:
Dictionary<string, double> dictionary = new Dictionary<string, double>();
dictionary.Add("Foo", 1.2);
dictionary.Add("Bar", 2.4);
foreach (KeyValuePair<string, double> pair in dictionary)
{
// work with pair.Key and pair.Value, each strongly typed
}
答案 1 :(得分:2)
如果您为数据类型添加扩展名。可以做些什么:
//imports
using MMExtensions;
//your namespace
namespace MMExtensions {
public static class DictionaryExtensions {
public static DataTable ToDataTable<TKey, TValue>(
this Dictionary<TKey, TValue> hashtable
){
var dataTable = new DataTable(hashtable.GetType().Name);
dataTable.Columns.Add("Key", typeof(object));
dataTable.Columns.Add("Value", typeof(object));
foreach (KeyValuePair<TKey, TValue> var in hashtable){
dataTable.Rows.Add(var.Key, var.Value);
}
return dataTable;
}
}
public static class HashtableExtensions {
public static DataTable ToDataTable(this Hashtable hashtable) {
var dataTable = new DataTable(hashtable.GetType().Name);
dataTable.Columns.Add("Key", typeof(object));
dataTable.Columns.Add("Value", typeof(object));
foreach (DictionaryEntry var in hashtable){
dataTable.Rows.Add(var.Key, var.Value);
}
return dataTable;
}
}
}
然后,您可以使用以下内容来创建表格。
DataTable dt = new Dictionary<string, int> {{"v1", 1}, {"v2", 2}}.ToDataTable();
DataTable dt2 = new Hashtable(){{"v1", 1}, {"v2", 2}}.ToDataTable();
请注意,我没有那么多改变。 C#已经有了hashmap数据结构,它被称为字典。此外,当循环集合时,使用foreach循环要好得多,因为它使用更安全的循环方式。您也可以使用特殊类型var
,但我认为它在这里失败了,因为您需要类型信息。
编辑:包含Hashtable扩展名。