我在互联网上找不到合适的搜索方法,但在visual studio上使用foreach循环打印简单数组时,出现了一些奇怪的情况.

int[] MyArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

foreach (int i in MyArray)
{
    Console.WriteLine(MyArray[i]);
}

我敢像在for循环中那样使用它来迭代,结果在命令提示符下显示为;

2 3 4 5 6 7 8 9 0 1.

我最终不能说"这不是正确的方式",然后继续前进.如下图所示,它在正确使用时有效.

foreach (var i in MyArray)
{
    Console.WriteLine(i);
}

有人能帮我激起好奇心吗?它是如何成功地工作的,同时又设法默默地失败的?

推荐答案

foreach循环不会给你一个索引值,它会给你the value个元素.在你的例子中,第一个元素是1,然后用like an index得到2.

下面是您的代码,其中包含WriteLine方法中的一些附加信息,以说明发生了什么

int[] MyArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
foreach (int i in MyArray)
{
    Console.WriteLine($"i is '{i}', MyArray[i] is '{MyArray[i]}'");
}
i is '1', MyArray[i] is '2'
i is '2', MyArray[i] is '3'
i is '3', MyArray[i] is '4'
i is '4', MyArray[i] is '5'
i is '5', MyArray[i] is '6'
i is '6', MyArray[i] is '7'
i is '7', MyArray[i] is '8'
i is '8', MyArray[i] is '9'
i is '9', MyArray[i] is '0'
i is '0', MyArray[i] is '1'

为了避免混淆,不要将foreach循环的变量命名为i.称之为能更好地代表你Collection 中的每一个元素的东西.

foreach (var number in MyArray)
{
    Console.WriteLine(number);
}

这不同于for循环,for循环(大多数情况下)与索引值一起工作

// this is why people call the for loop variable "i"
for (int index = 0; index < myArray.Length; index++)
{
    var number = myArray[index];
}

有趣的是,有is种方法可以通过foreach循环获得索引值,但它更高级,并且使用LINQ.

foreach (var data in MyArray.Select((x, i) => new { Value = x, Index = i}))
{
    var number = data.Value;
    var index = data.Index;
}

不过别担心,只有在你真的需要的时候才有必要.

Csharp相关问答推荐

为什么使用DXGI输出复制和Direct 3D时捕获的图像数据全为零?

如何使用C#和Graph API从Azure Directory获取用户详细信息

使用yaml将Azure函数代码部署到FunctionApp插槽时出现问题(zip未找到)

System. InvalidOperationException:无法将数据库中的字符串值i转换为映射的ItemType枚举中的任何值''''

有没有一种方法可以在包含混合文本的标签中嵌入超链接?

==和Tuple对象的相等<>

不带身份的Blazor服务器.Net 8 Cookie身份验证

将轮询与超时同步

发布用于Linux Ubuntu的C#应用程序

使用Orleans进行的单元测试找不到接口的实现

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

如何使用EF Core和.NET 8来upsert到具有多对多关系的表?

Linux Docker上的.NET6在某个时间抛出后,在加密操作期间发生System.Security.Cryptography.CryptographicException:错误

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

错误:此版本的Visual Studio无法打开以下项目

C#使用相同内存的多个数组

在.NET Maui中,Flyoutindow/Hamburger菜单可以在shell 之外实现吗?

使DefaultIfEmpty返回空

使用C#代码和SQL SERVER中的相同证书签名会产生不同的结果

使用ImmutableList时,DynamicData未按预期工作