我是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++;
}