2011-04-08 36 views
0

更好的办法是将一个哈希表中没有更好的办法,以数据表一个哈希表转换为数据表

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; 
} 

回答

4

这是做的一个非常简单的方法。然而,在这种特殊情况下,真正的惯用方式就是直接使用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 
} 
+0

我大多不使用C#,但我不明白为什么你的答案是更好的评价。也许你可以解释。例如1)IDictionaryEnumerator没有实现IDisposable接口,所以垃圾回收器不能处理它。当使用'using'关键字时,这会自动调用 - 我认为你甚至不能编译它。 2)'foreach(集合中的var项)' - 什么是项目? ...编译器不知道,所以你需要投2次元素,打败使用var的目的。 – Margus 2011-04-08 15:46:05

+0

@玛格斯,你说的没错。我的答案是从泛型集合的角度编写的,因为'IEnumerator '实现了'IDisposable'。 'IEnumerator',这是什么将用于旧版集合,不。如果这是'字典',我的答案会更合适。 – 2011-04-13 05:06:16

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,但是我认为它在这里击败了目的,因为你需要类型信息。

编辑:包括散列表扩展名。

+0

但它没有达到目的...从hasttable转换 – learner 2011-04-08 06:36:09

+0

@learner:我不同意,但仍包含散列表扩展名。 – Margus 2011-04-08 15:38:59

相关问题