C# 是否可以在C中通过引用foreach来迭代int数组#
可以在C#foreach循环中通过引用迭代int数组吗 我的意思是这样的:C# 是否可以在C中通过引用foreach来迭代int数组#,c#,C#,可以在C#foreach循环中通过引用迭代int数组吗 我的意思是这样的: int[] tab = new int[5]; foreach (ref int i in tab) { i=5; } 谢谢 可以在C#foreach中通过引用迭代int数组吗 环路 否,foreachC#中的循环不是为了对其迭代的集合进行更改而设计的。它使用了一个不能用作赋值目标的只读局部变量 您仍然可以使用for循环来执行此操作: var list = new List<MyClass>
int[] tab = new int[5];
foreach (ref int i in tab)
{
i=5;
}
谢谢
可以在C#foreach中通过引用迭代int数组吗
环路
否,foreach
C#中的循环不是为了对其迭代的集合进行更改而设计的。它使用了一个不能用作赋值目标的只读
局部变量
您仍然可以使用for
循环来执行此操作:
var list = new List<MyClass>();
for(var i = 0; i < list.Count; i++)
{
list[i] = new MyClass();
}
否,
foreach
循环将不允许循环变量引用其他变量。它总是将值从序列中复制到新变量中。要完成您想要做的事情,您需要使用一些结构,而不是foreach
循环。虽然从技术上讲,您可以编写自己的ForEach
方法来接受lambda,其中参数是对数组中某个项的引用,但结果……可能不值得
public delegate void ReferenceAction<T>(ref T param);
public static void ForEach<T>(T[] source, ReferenceAction<T> action)
{
for (int i = 0; i < source.Length; i++)
action(ref source[i]);
}
几乎可以肯定的是,有更好的方法来完成您想要做的事情,而不需要实际使用循环变量作为引用的循环。是的,这可能与问题中提出的语法完全相同 从Microsoft文档:从C#7.3开始,如果枚举器的当前属性返回引用返回值(ref T,其中T是集合元素的类型),则可以使用ref或ref readonly修饰符声明迭代变量 例如:
int val = 0;
int[] tab = new int[5];
foreach (ref int i in tab) {
i = val++;
}
foreach (ref readonly var j in tab) {
Console.WriteLine(j);
}
输出:
0
1
2
3
4
由于C#7.3,它可以工作,但需要将数组转换为一个跨度
int[]tab=newint[5];
foreach(tab.AsSpan()中的ref int i){
i=5;
}
Console.WriteLine(tab.Sum());//25
在Net Core 3.1和Net 5上测试。这是否编译<代码>int[]选项卡=新选项卡[5]为什么要这样做?为什么要这样做?tab[i]=5有什么问题代码>?只需使用一个常规for循环或编写一个简单的扩展方法来返回keyValuePairy,您可能需要查看
for
循环。什么与Enumerable.Range(1,5)相冲突。选择(x=>5)。ToArray()?您是在什么样的项目中创建的?我很想使用此功能,但在.NETCore3.1类库(C#8)中,它会抛出编译错误而不是编译。显然,您需要将数组强制转换为一个跨度,以使其工作。有关示例,请参见我的答案。@Dan Windows窗体和WPF使用.NET framework 4.5
int val = 0;
int[] tab = new int[5];
foreach (ref int i in tab) {
i = val++;
}
foreach (ref readonly var j in tab) {
Console.WriteLine(j);
}
0
1
2
3
4