是否有可能通过引用在C#中使用foreach迭代int数组

时间:2016-09-07 10:42:11

标签: c#

是否可以在C#foreach循环中通过引用迭代int数组?

我的意思是这样的:

 int[] tab = new int[5];
 foreach (ref int i in tab)
 {
     i=5;
 }

感谢

4 个答案:

答案 0 :(得分:1)

  

是否可以通过C#foreach中的引用迭代int数组   循环?

不,C#中的foreach循环不是为了对它迭代的集合进行更改。它使用readonly局部变量,不能用作分配目标。

仍然可以使用for循环来执行此操作:

var list = new List<MyClass>();

for(var i = 0; i < list.Count; i++)
{
   list[i] = new MyClass();
}

或者使用LINQ:

list = list.Select(e => new MyClass()).ToList(); // note that this will create a copy of list

答案 1 :(得分:1)

从 C# 7.3 开始,它可以工作,但您需要将数组转换为 Span。

int[] tab = new int[5];

foreach (ref int i in tab.AsSpan()) {
    i = 5;
}

Console.WriteLine(tab.Sum()); // 25

在 Net Core 3.1 和 Net 5 上测试。

答案 2 :(得分:0)

不,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]);
}
int[] tab = new int[5];
ForEach(tab, (ref int n) => n = 5);

几乎可以肯定,在没有实际循环变量作为参考的循环的情况下,有更好的方法来完成你尝试做的事情。

答案 3 :(得分:0)

是的,这可能与问题中提出的语法完全相同。

从Microsoft文档:从C#7.3开始,如果枚举数的Current属性返回参考返回值(ref T,其中T是集合元素的类型),则可以使用ref或ref readonly修饰符声明迭代变量。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/foreach-in

示例:

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