C# foreach 迭代器未按顺序遍历我的列表



我是C#的新手,我想知道是否有人能解释为什么列表没有在foreach循环中按顺序打印出来?我还注意到,如果你在观察窗口中查看卡片,.ToList()会更改卡片的顺序。为什么会这样?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CardShuffle
{
    class Program
    {
        static void Main(string[] args)
        {
            var r = new Random();
            var cards = Enumerable.Range(0, 51);
            var shuffledcards = cards.OrderBy(a => r.Next(1000));
            var aList = shuffledcards.ToList();
            foreach( int card in aList)
            {
                Console.WriteLine("Card {0} is {1}.", card, aList[card]);
            }
            Console.WriteLine();
            for (int card = 0; card < aList.Count; ++card )
            {
                Console.WriteLine("Card {0} is {1}.", card, aList[card]);
            }
            Console.ReadKey();
        }
    }
}

您的foreach中有一个错误;

foreach( int card in aList)
{
    Console.WriteLine("Card {0} is {1}.", card, aList[card]);
}

card不是索引,而是值本身。因此,您打印值(作为卡号),然后随机访问该索引处的任何内容,并将其显示为值。您应该使用计数器来显示卡号,并使用card来替换{1}

int i = 0;
foreach( int card in aList)
{
     Console.WriteLine("Card {0} is {1}.", i, card);
     i++;
}

假设您有

List<int> aList = new List<int>();
aList.Add(1);
aList.Add(5);
aList.Add(10);
aList.Add(20);

而你正试图进行

foreach( int card in aList)
   {
      Console.WriteLine("Card {0} is {1}.", card, aList[card]);
   }

您实际要做的是尝试访问数组的随机元素,因为在我的第二个循环中,它将访问数组的第五个元素,而不是第二个元素,所以如果您想要正确的结果,则需要运行for循环。

在foreach循环中,您使用值作为索引来编写卡片。在for循环中,你根据索引按顺序写卡片。

您的foreach循环逻辑错误。您要做的是从aList集合中获取项目,然后将它们用作索引,以获取aList集合中的另一个元素。这就是为什么你会得到这样的输出。

要从foreach获得与for循环相同的输出,请尝试:

foreach (var item in aList.Select((c, i) => new { card = c, index = i }))
{
    Console.WriteLine("Card {0} is {1}.", item.index, item.card);
}

foreach循环不正确。试试这个

int counter = 0;
foreach( int card in aList)
{
    Console.WriteLine("Card {0} is {1}", counter , card);
    counter++;
}

最新更新