c# – 如何更改foreach迭代器引用的原始数据类型变量的值
发布时间:2020-12-15 23:34:04 所属栏目:百科 来源:网络整理
导读:如果我有一个类Ball,其属性半径为set访问器,我可以使用foreach循环设置Ball对象列表的半径: foreach(Ball ball in balls){ ball.radius = 1;} 但是如果我迭代一组原始数据类型,这不起作用,因为原语没有访问器.如果我尝试更改原始数据类型的值,我实际上是在
如果我有一个类Ball,其属性半径为set访问器,我可以使用foreach循环设置Ball对象列表的半径:
foreach(Ball ball in balls) { ball.radius = 1; } 但是如果我迭代一组原始数据类型,这不起作用,因为原语没有访问器.如果我尝试更改原始数据类型的值,我实际上是在迭代器上执行操作,而不是为自身值,所以以下方法不起作用: foreach(double radius in radii) { radius = 1; } 我尝试用指针解决它,像这样: double* p; foreach(double radius in radii) { p = &radius; *p = 1; } 不出所料,因为p指的是迭代器占用的地址,而不是变量. 如果它在这里很重要,我将更具体地说明我实际上要做的事情,虽然我仍然想要回答我的主要问题,但很可能有一种更简单的方法来做这个方法列表<>,我不太熟悉.我有一个List< List< double>>,我想改变它的每个元素,特别是通过将每个元素除以标准化常数normalisationFactor.以下工作完美: for (int i = 0; i < array.Count; i++) { for (int j = 0; j < array[0].Count; j++) { array[i][j] /= normalisationFactor; } } 但是,我发现foreach语法更具可读性,并且如果可以的话我想这样做.由于我上面详述的原因,以下内容不起作用: foreach (List<double> row in array) { foreach (double value in row) { value /= normalisationFactor; } } 那么,如何使用foreach循环实现我想要的呢? 解决方法
primitives(structs)是不可变的,并且作为值而不是指针传递.
IEnumerables不提供更新数据的方法. 如果您知道下划线数据类型(Array,Collection,List),只需循环位置索引并更新集合位置 for (var i=0; i < radius.Count; i++) radius[i] = newValue (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |