当前位置:编程学习 > C#/ASP.NET >>

如何将DataTable转化为结果集

如何将DataTable转化为“键值对”结果集,使多条记录结果集可以通过“键”来进行索引?

DataRow应该不可以通过“键”来索引的吧,只能通过“Index”来索引,对吧? --------------------编程问答-------------------- 定义一个字典Dictory<string,string> value=new Dictory<string,string>();

dataTable是个二维列表 然后按你想要的方式添加这个字典即可! --------------------编程问答-------------------- 用LINQ处理
http://archive.cnblogs.com/a/2169453/ --------------------编程问答-------------------- 用LINQ可以处理 --------------------编程问答--------------------      //构建数据源
      Dictionary<int, Student1> students = new Dictionary<int, Student1>();
     students.Add(1,   new Student1 { Name = "Svetlana",  Scores = new int[] { 98, 92, 81, 60 } });
     students.Add(2,   new Student1 { Name = "Claire", Scores = new int[] { 75, 84, 91, 39 }});
     students.Add(3,  new Student1 { Name = "Sven",   Scores = new int[] { 88, 94, 65, 91 }});
     students.Add(4,  new Student1 { Name = "Cesar",  Scores = new int[] { 97, 89, 85, 82 }}); --------------------编程问答--------------------
引用 4 楼 wellbeingzhang 的回复:
     //构建数据源
      Dictionary<int, Student1> students = new Dictionary<int, Student1>();
     students.Add(1,   new Student1 { Name = "Svetlana",  Scores = new int[] { 98, 92, 81, 60 } });
     st……


除了用用“Dictionary”数据字典,应该还有“HashTable”可以用。
问题一:“Dictionary”数据字典和“HashTable”哈希表有什么不同呢?
问题二:如果用HashTable方法应该怎么写呢? --------------------编程问答-------------------- --------------------编程问答-------------------- “Dictionary”数据字典和“HashTable”哈希表有什么不同呢
引用 5 楼 starrywcf 的回复:
引用 4 楼 wellbeingzhang 的回复:

//构建数据源
Dictionary<int, Student1> students = new Dictionary<int, Student1>();
students.Add(1, new Student1 { Name = "Svetlana", Scores = new int[] { 98, 92, 81, 60 } })……

引用 2 楼 chinajiyong 的回复:
用LINQ处理
http://archive.cnblogs.com/a/2169453/


建议用linq --------------------编程问答-------------------- dt.PrimaryKey
dt.Rows.Find --------------------编程问答--------------------
public static Dictionary<string, object> GetDic(DataTable d)
        {
            Dictionary<string, object> arr = new Dictionary<string, object>();

            //创建列集合
            List<object> columns = new List<object>();
            foreach (DataColumn dc in d.Columns)
            {
                Dictionary<string, object> a = new Dictionary<string, object>();
                a.Add("name", dc.ColumnName);
                columns.Add(a);
            }

            //创建行集合
            List<object> rows = new List<object>();
            foreach (DataRow rw in d.Rows)
            {
                Dictionary<string, object> col = new Dictionary<string, object>();
                foreach (DataColumn dc in d.Columns)
                {
                    col.Add(dc.ColumnName, rw[dc.ColumnName]);
                }
                rows.Add(col);
            }
            //
            arr.Add("columns", columns);
            arr.Add("rows", rows);
            return arr;
        }
--------------------编程问答-------------------- 感谢各位大大的回复,学习了 --------------------编程问答--------------------
public static Dictionary<string, object> GetDic(DataTable d)
        {
            Dictionary<string, object> arr = new Dictionary<string, object>();

            //创建列集合
            List<object> columns = new List<object>();
            foreach (DataColumn dc in d.Columns)
            {
                Dictionary<string, object> a = new Dictionary<string, object>();
                a.Add("name", dc.ColumnName);
                columns.Add(a);
            }

            //创建行集合
            List<object> rows = new List<object>();
            foreach (DataRow rw in d.Rows)
            {
                Dictionary<string, object> col = new Dictionary<string, object>();
                foreach (DataColumn dc in d.Columns)
                {
                    col.Add(dc.ColumnName, rw[dc.ColumnName]);
                }
                rows.Add(col);
            }
            //
            arr.Add("columns", columns);
            arr.Add("rows", rows);
            return arr;
        }


刚刚发的呢?怎么没有,唉... --------------------编程问答-------------------- List<>、HashTable、Dictionary 它们有什么共同之处,又有什么不同呢? --------------------编程问答-------------------- List<>、HashTable、Dictionary 它们有什么共同之处,又有什么不同呢? --------------------编程问答-------------------- 表示键和值的集合。Dictionary遍历输出的顺序,就是加入的顺序,这点与Hashtable不同 
Dictionary<string, string> myDic = new Dictionary<string, string>();
myDic.Add("aaa", "111");
myDic.Add("bbb", "222");
myDic.Add("ccc", "333");
myDic.Add("ddd", "444");
//如果添加已经存在的键,add方法会抛出异常
try
{
myDic.Add("ddd","ddd");
}
catch (ArgumentException ex)
{
Console.WriteLine("此键已经存在:" + ex.Message);
}
//解决add()异常的方法是用ContainsKey()方法来判断键是否存在
if (!myDic.ContainsKey("ddd"))
{
myDic.Add("ddd", "ddd");
}
else
{
Console.WriteLine("此键已经存在:");
}
//而使用索引器来负值时,如果建已经存在,就会修改已有的键的键值,而不会抛出异常
myDic ["ddd"]="ddd";
myDic["eee"] = "555";
//使用索引器来取值时,如果键不存在就会引发异常
try
{
Console.WriteLine("不存在的键""fff""的键值为:" + myDic["fff"]);
}
catch (KeyNotFoundException ex)
{
Console.WriteLine("没有找到键引发异常:" + ex.Message);
}
//解决上面的异常的方法是使用ContarnsKey() 来判断时候存在键,如果经常要取健值得化最好用 TryGetValue方法来获取集合中的对应键值
string value = "";
if (myDic.TryGetValue("fff", out value))
{
Console.WriteLine("不存在的键""fff""的键值为:" + value );
}
else

Console.WriteLine("没有找到对应键的键值"); 
}

//下面用foreach 来遍历键值对
//泛型结构体 用来存储健值对
foreach (KeyValuePair<string, string> kvp in myDic)
{
Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
}
//获取值得集合
foreach (string s in myDic.Values)
{
Console.WriteLine("value={0}", s);
}
//获取值得另一种方式
Dictionary<string, string>.ValueCollection values = myDic.Values;
foreach (string s in values)
{
Console.WriteLine("value={0}", s);
}

 

 

常用的属性和方法如下 
常用属性 
属性说明
Comparer 
获取用于确定字典中的键是否相等的 IEqualityComparer。 
Count 
获取包含在 Dictionary中的键/值对的数目。 
Item 
获取或设置与指定的键相关联的值。
Keys 
获取包含 Dictionary中的键的集合。 
Values 
获取包含 Dictionary中的值的集合。 
常用的方法 
方法说明 
Add 
将指定的键和值添加到字典中。 
Clear 
从 Dictionary中移除所有的键和值。 
ContainsKey 
确定 Dictionary是否包含指定的键。 
ContainsValue 
确定 Dictionary是否包含特定值。 
Equals 
已重载。 确定两个 Object实例是否相等。 (从 Object继承。) 
GetEnumerator 
返回循环访问 Dictionary的枚举数。 
GetHashCode 
用作特定类型的哈希函数。GetHashCode适合在哈希算法和数据结构(如哈希表)中使用。 (从 Object继承。) 
GetObjectData 
实现 System.Runtime.Serialization.ISerializable接口,并返回序列化 Dictionary实例所需的数据。 
GetType 
获取当前实例的 Type。 (从 Object继承。) 
OnDeserialization 
实现 System.Runtime.Serialization.ISerializable接口,并在完成反序列化之后引发反序列化事件。 
ReferenceEquals 
确定指定的 Object实例是否是相同的实例。 (从 Object继承。) 
Remove 
从 Dictionary中移除所指定的键的值。 
ToString 
返回表示当前 Object的 String。 (从 Object继承。) 
TryGetValue 
获取与指定的键相关联的值。 

--------------------编程问答-------------------- 6.Hashtable类 
哈希表,名-值对。类似于字典(比数组更强大)。哈希表是经过优化的,访问下标的对象先散列过。如果以任意类型键值访问其中元素会快于其他集合。 
GetHashCode()方法返回一个int型数据,使用这个键的值生成该int型数据。哈希表获取这个值最后返回一个索引,表示带有给定散列的数据项在字典中存储的位置。
Hashtable 和 Dictionary <K, V> 类型 
1:单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
2:多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
3:Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.

HashTable中的key/value均为object类型,由包含集合元素的存储桶组成。存储桶是 HashTable中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。HashTable的优点就在于其索引的方式,速度非常快。如果以任意类型键值访问其中元素会快于其他集合,特别是当数据量特别大的时候,效率差别尤其大。

HashTable的应用场合有:做对象缓存,树递归算法的替代,和各种需提升效率的场合。
//Hashtable sample
System.Collections.Hashtable ht = new System.Collections.Hashtable(); 
//--Be careful: Keys can't be duplicated, and can't be null----
ht.Add(1, "apple");
ht.Add(2, "banana");
ht.Add(3, "orange"); 
//Modify item value:
if(ht.ContainsKey(1))
ht[1] = "appleBad"; 
//The following code will return null oValue, no exception
object oValue = ht[5]; 
//traversal 1:
foreach (DictionaryEntry de in ht)
{
      Console.WriteLine(de.Key);
      Console.WriteLine(de.Value);

//traversal 2:
System.Collections.IDictionaryEnumerator d = ht.GetEnumerator();
while (d.MoveNext())
{
      Console.WriteLine("key:{0} value:{1}", d.Entry.Key, d.Entry.Value);

//Clear items
ht.Clear();

Dictionary和HashTable内部实现差不多,但前者无需装箱拆箱操作,效率略高一点。
//Dictionary sample
System.Collections.Generic.Dictionary<int, string> fruits = new System.Collections.Generic.Dictionary<int, string>();
fruits.Add(1, "apple");
fruits.Add(2, "banana");
fruits.Add(3, "orange"); 
foreach (int i in fruits.Keys)
{
      Console.WriteLine("key:{0} value:{1}", i, fruits); }
if (fruits.ContainsKey(1))
{
       Console.WriteLine("contain this key.");
}


HashTable是经过优化的,访问下标的对象先散列过,所以内部是无序散列的,保证了高效率,也就是说,其输出不是按照开始加入的顺序,而Dictionary遍历输出的顺序,就是加入的顺序,这点与Hashtable不同。如果一定要排序HashTable输出,只能自己实现:
--------------------编程问答-------------------- List 类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组实现 IList 泛型接口。

List 类既使用相等比较器又使用排序比较器。 

诸如 Contains、IndexOf、LastIndexOf 和 Remove 这样的方法对列表元素使用相等比较器。类型 T 的默认相等比较器按如下方式确定。如果类型 T 实现 IEquatable 泛型接口,则相等比较器为该接口的 Equals 方法;否则,默认相等比较器为 Object.Equals(Object)。

诸如 BinarySearch 和 Sort 这样的方法对列表元素使用排序比较器。类型 T 的默认比较器按如下方式确定。如果类型 T 实现 IComparable 泛型接口,则默认比较器为该接口的 CompareTo 方法;否则,如果类型 T 实现非泛型 IComparable 接口,则默认比较器为该接口的 CompareTo 方法。如果类型 T 没有实现其中任一个接口,则不存在默认比较器,并且必须显式提供比较器或比较委托。

List 不保证是排序的。在执行要求 List 已排序的操作(例如 BinarySearch)之前,您必须对 List 进行排序。

可使用一个整数索引访问此集合中的元素。此集合中的索引从零开始。

List 接受 空引用(在 Visual Basic 中为 Nothing) 作为引用类型的有效值并且允许有重复的元素。

--------------------编程问答-------------------- --------------------编程问答--------------------
引用 16 楼  的回复:
List 类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组实现 IList 泛型接口。

List 类既使用相等比较器又使用排序比较器。 

诸如 Contains、IndexOf、LastIndexOf 和 Remove 这样的方法对列表元素使用相等比较器。类型 T 的默认相等比较器按如下方式确定。如果类型 T 实现 IEquatable 泛型接口,则相等比较……


顶一下啊。。。 --------------------编程问答-------------------- 完全没必要转。 --------------------编程问答-------------------- http://msdn.microsoft.com/zh-cn/library/system.data.datarow.item%28v=vs.80%29.aspx

谁教你的去找块砖头把他脑浆砸出来 --------------------编程问答-------------------- --------------------编程问答-------------------- “Dictionary”默认实现了“IEqualityComparer”接口对吧??? --------------------编程问答--------------------

public static Dictionary<string, object> GetDic(DataTable d)
        {
            Dictionary<string, object> arr = new Dictionary<string, object>();

            //创建列集合
            List<object> columns = new List<object>();
            foreach (DataColumn dc in d.Columns)
            {
                Dictionary<string, object> a = new Dictionary<string, object>();
                a.Add("name", dc.ColumnName);
                columns.Add(a);
            }

            //创建行集合
            List<object> rows = new List<object>();
            foreach (DataRow rw in d.Rows)
            {
                Dictionary<string, object> col = new Dictionary<string, object>();
                foreach (DataColumn dc in d.Columns)
                {
                    col.Add(dc.ColumnName, rw[dc.ColumnName]);
                }
                rows.Add(col);
            }
            //
            arr.Add("columns", columns);
            arr.Add("rows", rows);
            return arr;
        } --------------------编程问答--------------------
public static Dictionary<string, object> GetDic(DataTable d)
        {
            Dictionary<string, object> arr = new Dictionary<string, object>();

            //创建列集合
            List<object> columns = new List<object>();
            foreach (DataColumn dc in d.Columns)
            {
                Dictionary<string, object> a = new Dictionary<string, object>();
                a.Add("name", dc.ColumnName);
                columns.Add(a);
            }

            //创建行集合
            List<object> rows = new List<object>();
            foreach (DataRow rw in d.Rows)
            {
                Dictionary<string, object> col = new Dictionary<string, object>();
                foreach (DataColumn dc in d.Columns)
                {
                    col.Add(dc.ColumnName, rw[dc.ColumnName]);
                }
                rows.Add(col);
            }
            //
            arr.Add("columns", columns);
            arr.Add("rows", rows);
            return arr;
        }
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,