我是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();
}
}
}
答案 0 :(得分:4)
你的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++;
}
答案 1 :(得分:0)
假设你有
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循环结果。
答案 2 :(得分:0)
在foreach循环中,您使用值作为索引来编写卡片。在for循环中,您可以根据索引按顺序编写卡片。
答案 3 :(得分:0)
您的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);
}
答案 4 :(得分:0)
您的foreach循环不正确。试试这个
int counter = 0;
foreach( int card in aList)
{
Console.WriteLine("Card {0} is {1}", counter , card);
counter++;
}