如何绘制存储在列表中的数组的内容

本文关键字:列表 数组 存储 何绘制 绘制 | 更新日期: 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#程序员,但这或多或少是你可以做的