如何绘制存储在列表中的数组的内容
本文关键字:列表 数组 存储 何绘制 绘制 | 更新日期: 2023-09-27 18:01:09
我有一个文件,其中包含以下格式的分数:
000001,1
000002,2
000012,1
232124,1
我构建了一个数组,其中包含作为第一个元素的分数和作为第二个元素的难度。然后我将数组添加到列表中,如下所示:
// load highscores
public void LoadScores()
{
StreamReader file = new StreamReader("highScores.txt");
// loop through each line in the file
while ((line = file.ReadLine()) != null)
{
// seperate the score from the difficulty
lineData = line.Split(',');
// add each line to the list
list.Add(lineData);
}
OrderScores();
}
接下来,我使用IEnumerable
:订购列表
IEnumerable<string[]> scoresDesNormal, scoresDesHard;
// order the list of highscores
protected void OrderScores()
{
// order the list by descending order with normal difficulty at the top
scoresDesNormal = list.OrderByDescending(ld => lineData[0]).Where(ld => lineData[1].Contains("1"));
// order the list by descending order with hard difficulty at the top
scoresDesHard = list.OrderByDescending(ld => lineData[0]).Where(ld => lineData[1].Contains("2")).Take(3);
}
现在我想使用spriteBatch.DrawString()
将两个IEnumerable
列表打印到屏幕上。如何正确地遍历列表元素和它们旁边的数组?我想打印出存储在列表中的每个数组的两个元素。
首先,您的问题。
如果您确实知道如何绘制1个字符串,并且您想绘制2个字符串并在它们之间使用分隔符",",只需执行以下操作:
...
string firstString = ...
string secondString = ...
string toBeDrawn = firstString + "," + secondString;
DrawThisFellah ( toBeDrawn );
...
那么,你有string[]
吗?没有问题:
...
string[] currentElement = ...
string firstString = currentElement[0];
string secondString = currentElement[1];
// etc
...
其次,您不需要添加前导零,只为使按字母顺序排列的OrderByDescending
起作用。您可以解析(从而验证(字符串,并将它们存储在类型为int[]
而不是string[]
的元素中。
第三,您可能对此感兴趣!
在不知道自己在使用LINQ的情况下使用它是危险的。您知道您的IEnumerable<string[]>
实际上是查询吗?
可以说您的IEnumerable<string[]>
对象实际上是"CODE AS DATA"。它们包含不是OrderByDescending
的结果,而是逻辑本身。
这意味着,如果你的lineData
:中有3个string[]
元素
{ "1", "122" }, { "3", "42" }, { "5", "162" }
并且您调用OrderScores
,则在枚举scoresDesNormal
时会注意到结果(例如(。以下代码:
foreach (var element in scoresDesNormal)
Console.WriteLine("{0}, {1}", element[0], element[1]);
将打印到控制台:
1, 122
5, 162
(因为第二个元素在第二个子元素上没有"1"个字符(
但是如果您继续通过插入新元素或移除元素(应该是List<string[]>
(或简单地通过修改现有元素的值(应该是基元数组(来修改lineData
集合,则在枚举scoresDesNormal
时将观察到新结果,而不调用OrderScores
!
例如,以下代码的注释是正确的(假设您有一个List<string[]> lineData
(:
List<string[]> lineData = new List<string[]>(new[] {
new[] { "1", "122" }, // contains 1
new[] { "3", "42" }, // does not contain 1
new[] { "5", "162" } // contains 1
});
OrderScores();
foreach (var element in scoresDesNormal)
Console.WriteLine(element[1]);
// the previous foreach prints out
// 162
// 122
lineData[1][1] = "421"; // make the "42" in the list become "421"
foreach (var element in scoresDesNormal)
Console.WriteLine(element[1]);
// the previous foreach prints out - even though we haven't called OrderScores again
// 162
// 421
// 122
如果我是你,我会这样做,
如果用户单击或按下按钮查看分数,请打开一个方法,如以下方法。
public void DisplayScores()
{
Rectangle[] PositionOfText = new Rectangle[scoresDesNormal];
for (int i = 0; i< scoresDesNormal.Count; i++)
{
PositionOfText = new Rectangle(xPos, yPos, Width, Height);
}
//do the same for the other difficulties, this sets the position of the texts.
导入要使用的fontbatch。在你的绘图方法中有这样的东西,
for (int i = 0; i< scoresDesNormal.Count; i++)
spritebatch.drawString(MyFontBatch, scoresDesNormal[i], PositionOfText, Color.//your preffered color.
现在我可以理解他们可能是错误的,但我不是一个流利的c#程序员,但这或多或少是你可以做的