关于forEach方法能否改变数组中每一项的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于forEach方法能否改变数组中每一项的值相关的知识,希望对你有一定的参考价值。

参考技术A         在对数组中的某一项进行修改的时候,总是情不自禁地想到用foreach遍历,在遍历的时候通过条件判断来改变其某一项的值。这种想法真是太危险了。这是因为foreach传入的函数中的参数item其实是对其原数组的每一项的拷贝,因此在函数里修改的item并不是其真正的item。用这种方法根本没有办法修改到其原数组。因此,修改数组中某一项还是要通过数组下标的方式。目前我常用方法是先通过findIndex找到修改数组的某一项的index,再通过splice的方法进行修改。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

       现在看自己之前写的这篇实在是太不严谨了,不过这也是新手常会犯的的问题。不过之前终极原因还是提到了就是foreach传入的函数中的参数item其实是对其原数组的每一项的拷贝,因此,用这种方式来修改原数组的值则必须取到原数组项的地址直接修改。用item = fn(item)是肯定不行的。可以利用forEach中的第二个参数index,通过arr[index]的方式进行修改。

asp.net 如何取出List<T>中每一项的值

如题, 我有一个泛型集合 List<T> list=new List<T>(); 我在实例化的时候T是不确定的, 此时我将list传递到b页面,在b页面如何取出list集合中的每一项,每一个字段的值 注:在b页面中也不能确定T是什么
对了, T是一个实体对象, 只是不确定具体是哪一个实体

你在实例化的时候如何做到T是的类型是不确定的?。。。
泛型类是这么用的
public class MyList<T> : List<T>

//这里重写一个将T中的属性全显示出来的方法
public override string ToString()

string result = string.Empty;
foreach (T obj in this)

result += "[";
PropertyInfo[] ps = obj.GetType().GetProperties();
//循环获取该对象的所有属性和值
foreach (PropertyInfo info in ps)

result += "属性:" + info.Name + " ";
result += "值:" + info.GetValue(obj,null)+" ";

result += "],";

return result.TrimEnd(',');


然后自定义一个对象Student
public class Student

private string _name = string.Empty;
public string Name

set _name = value;
get return _name;

private int _age = 0;
public int Age

set _age = value;
get return _age;



使用时:
Student s1 = new Student();
s1.Name = "stu1";
s1.Age = 90;
Student s2 = new Student();
s2.Name = "stu2";
s2.Age = 70;
MyList<Student> list = new MyList<Student>();
//如果你需要跨页面传递,这里可以选择把list存到Session里
list.Add(s1);
list.Add(s2);
//跨页面的话,要把Session转换回来,这里模拟一下就用上边已经定义的list了
IList<Student> newList=list;
//newList.ToString()显示所有对象的属性和值,已经在泛型集合里定义好的
Console.WriteLine(newList.ToString());
Console.Read();追问

就是通过方法传递, 比如b页面中有一个方法
void GetList( List list )

//在这个方法中, 我想遍历list集合, 然后取出集合中每一项的字段的值
//T:T是一个Class类的实体,比如Student类, 成员有Name,Age
//然后我想在遍历的时候,分别取出Name和Age的值, 当然,Student只是举例, 我还可以传递其他的实体对象,然后分别取出实体对象中的值

追答

第一,你不能够跨页面将list传递过去,B页面公开了方法也不行。你只能用Session,Cookie等对象进行传递。如果你的B页面仅仅是做了一个方法然后有返回值,那B页面可以改成B类来实现。

第二,在我写的例子中,MyList就是一个自定义的泛型集合类。所谓泛型,就是对于T不管是任何类型的情况下,都可以使用MyList这个集合类来实现需要的功能,而不是说List这个T是可以随意使用的,你在实例化的时候必须确定类型,比如MyList,而你在另外个页面,这个对象也只能还原成MyList,然后调用自定义的ToString方法显示所有对象的属性和值。

追问

非常感谢你的解答。用了你提供的一些意见, 成功的将10万条的测试数据用零点几秒时间插入到数据库中了, 谢谢!

参考技术A 我有点疑问啊,页面之间能传集合吗?页面间传值方式无非那么几种,session,application, QueryString。。。

除非你是页面A 的class A 调用 页面B 的 方法 public voidTest<T>()(List<T> list)


如果是这样,这个泛型泛型T必须进行泛型约束 , 比如这里有个 class C
public voidTest<T>()(List<T> list) where T: C

//在这里边你可以使用 C类型对象的属性和方法
参考技术B 你怎么传递到b页面?
是说传递到b的一个方法里吗?
b页面方法大致代码如下:
void abc<T>(List<T> list)
foreach(T item in list)
// 对当前这一项做处理吧

追问

嗯 ,是的, 比如我用一个方法将list传递到另外一个页面,我想要在那一个页面中对list进行遍历并取值, 只是不知道list属于哪个实体的集合, 所以不知道该怎么取值了

追答

你必须知道这个实体有什么样的功能,如果不知道,只能简单的去调用ToString()方法了

通常都要求这个T实现了一个接口,然后就可以对这个接口的方法进行调用了

追问

能给个具体的例子吗?

以上是关于关于forEach方法能否改变数组中每一项的值的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 如何取出List<T>中每一项的值

js数组的五种迭代遍历方式 every filter forEach map some

更改数组中每个项目的属性?

JavaScript数组和字符串的操作方法

引用类型: 迭代方法

javascript 数组去重