c#用foreach遍历数组、列表时是直接获得数据元素,而foreach哈希表时,为啥获得的是命名空间名??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#用foreach遍历数组、列表时是直接获得数据元素,而foreach哈希表时,为啥获得的是命名空间名??相关的知识,希望对你有一定的参考价值。

Hashtable ht = new Hashtable();//创建哈希表ht
ht.Add(1, "a"); //往ht里添加键值对
int[]num=4,5,6;
foreach (var n in ht) //遍历哈希表ht,结果如下图

Console.WriteLine(n);


foreach (var n in num) //遍历数组num

Console.WriteLine(n);


为什么foreach (var n in num) 可以直接让n获得数组num的元素?
而foreach (var n in ht)却没能让n获得哈希表ht的元素呢?

因为NUM是一位数组,遍历的时候可以直接取到对应的值

Hashtable 是键值对,遍历的的时候娶到的是其中某一对键值

Hashtable ht = new Hashtable();
foreach (DictionaryEntry dic in ht)
 
     Console.WriteLine(dic.Key + "--" + dic.Value);
 

追问

DictionaryEntry是返回此类型的实例,那它可以遍历返回某个类的对象实例吗,我刚才试写了个类Student,然后在主函数里写 Student类数组。但遍历错误
Student[] stu = s1,s2; //Student类型的数组
foreach (DictionaryEntry n in stu) //这里报错

追答

foreach遍历函数,in 后边的对象的集合,那么in前边就应该是对应的对象,有对象要调用就应该实例化一个,因此这里面就是这样写的 foreach(对象 实例名 in 对象集合)

参考技术A Hashtable遍历的时候,是一个对象,
foreach (DictionaryEntry n in ht) //遍历哈希表ht,结果如下图

n.Key
n.Value

追问

我搜索看到DictionaryEntry是返回返回此类型的实例,那它可以遍历返回某个类的对象实例吗,我刚才试写了个类Student,然后在主函数里写 Student类数组。遍历错误
Student[] stu = s1,s2; //Student类型的数组
foreach (DictionaryEntry n in stu) //这里报错

追答

foreach (Student n in stu)

看你遍历对象是什么类型的,如果HashTable,就是DictionaryEntry

是Student[],就是Student ,其他对象就灵活处理

追问

谢了。除了哈希表、list,还有没有类似常用的存储结构啊?有的话我去看看归纳一起。

本回答被提问者采纳
参考技术B foreach取的东西是正确的,但是哈希表里面的结果不是数字也不是字符而是一个键值对,你直接用Console.WriteLine(n);是打印不出来的。
要想打印出结果必须把他转换成哈希表值的对象,然后找出其中的value。追问

foreach可以遍历 某个类的所有实例 吗,可以的话怎么写?

追答

“Student[] stu = s1,s2; //Student类型的数组
foreach (DictionaryEntry n in stu) //这里报错


你完全没有理解foreach的使用方法,你的数组里面是什么类,这里就要写什么类。foreach (Student n in stu) 用自然语言来读就是“对stu里面的每一个student进行遍历”

之前那个DictionaryEntry是Dictionary(c#里用哈希表实现)里面一个键值对的对象,和你这个完全没有关系。

C#的foreach函数问题

哪位朋友能帮我详细的说明一下foreach函数。

目前只知道他是复制数组的工具。 其他就一无所知了。

还有,想问一下能不能用foreach实现反向复制。
也就是 数组里的数据 1,2,3 复制到另一个数组时变成3,2,1.

谢谢各位了。

LZ 可能理解错了 foreach 是遍历 数组
它不关可以遍历数组还可以是集合等等
比如 你是int的数组
foreach(int [变量名] in 数组名)

[变量名](这个就是数组里具体的值了)

其实道理和 for循环是一样的 只是写法不一样
for(int i=0;i<10;i++)

数组名[i](也是数组里具体的值)

这里的数组名[i]和上面的[变量名] 是一样的
参考技术A 举个例子
num是一个int数组
foreach(int i in num)
...
foreach是一个类似for的循环具体到这句的意思是说 "循环遍历"num中所有元素
每次循环从num中提出一个元素作为i进入循环体内
一直循环,直到遍历结束num中所有的元素为止
foreach好像没有能反向读取数组吧
但是你说的123变321肯定是可以的,我给你个思路,你自己去想
数组A里面是1,2,3
数组B里面是空的
foreach数组A
把1存入数组B
存2的时候把数组B的0下标的值传给下标1的位置,然后再让2存入下标0的位置
以此类推,学习的价值在自己想,加油吧
参考技术B foreach 是迭代器 当一个类实现了IEnumerable 和 IEnumerator 这两个接口就可以实现迭代这类的对象;

至于数组的反向复制 可以用ArrayList 数组来实现,先调用ArrayList对象的反向排列方法Reverse()然后调用Copy()或ToArray()方法拷贝到一个数组 就行了
参考技术C 反向复制用foreach貌似还不如循环来的快啊

以上是关于c#用foreach遍历数组、列表时是直接获得数据元素,而foreach哈希表时,为啥获得的是命名空间名??的主要内容,如果未能解决你的问题,请参考以下文章

C#检查foreach为null判断

c#如何遍历一个list将值传到数组

C#的foreach函数问题

c#怎么遍历dictionary

foreach 循环不会遍历列表中的所有项目 - C#

在遍历集合时是应该用for还是用foreach