Unity迭代列表以按数字值排序

时间:2018-02-16 12:19:49

标签: list unity3d streamreader streamwriter

我有一个名为highscore.txt的文本文件,我知道进入文件的数据格式,其工作方式如下:

StackOverflowException

然后,我需要搜索整个文件以查看需要添加新分数的位置,以使文件按照从最大到最小的分数顺序

Username:score

以上只是简单地不改变文本文件并将其保留原样,任何关于我做错的想法?​​

1 个答案:

答案 0 :(得分:1)

您应该将代码更改为:

<强> ScoreList.cs

using UnityEngine;
using System;
using System.IO;
using System.Collections.Generic;

public class ScoreList : MonoBehaviour {

    private void Start() {
        GameOver.GameOverEvent += UpdateScoreBoardFile;
    }

    private void UpdateScoreBoardFile(string playerName, int playerScore) {
        string lineValues;
        string finalPath = "[ScoreBoard File Location]";
        List<string> tempoaryList = new List<string>();
        List<int> valueList = new List<int>();
        bool isScoreLowest = true;

        using (StreamReader sr = new StreamReader(finalPath)) {
            while (sr.EndOfStream == false) {
                lineValues = sr.ReadLine();
                tempoaryList.Add(lineValues);
                int data = Convert.ToInt32(lineValues.Substring(lineValues.LastIndexOf(':') + 1));
                valueList.Add(data);
            }
        }

        if (tempoaryList != null) {
            for (int i = 0; i < valueList.Count; i++) {
                if (valueList[i] <= playerScore) {
                    tempoaryList.Insert(i, playerName + ":" + playerScore.ToString());
                    isScoreLowest = false;
                    break;
                }
            }
        }

        if (isScoreLowest) {
            tempoaryList.Add(playerName + ":" + playerScore.ToString());
        }

        using (StreamWriter sw = new StreamWriter(finalPath, false)) {
            for (int i = 0; i < tempoaryList.Count; i++) {
                sw.WriteLine(tempoaryList[i]);
                Debug.Log(tempoaryList[i]);
            }
        }
    }
}

GameOver.cs (或在任何情况下管理游戏的情况):

using UnityEngine;
using System;

public class GameOver : MonoBehaviour {

    public static event Action<string, int> GameOverEvent;
    string playerName;
    int finalScore;

    private void GameOver() {
        //Do other stuff when the game is over
        GameOverEvent(playerName, finalScore);
    }
}

更改说明:

isScoreLowest需要Add列表末尾的新最低分,因为for循环不会自行添加。

当记分板为空时,if (tempoaryList != null)检查完成以跳过for循环。

你自己做了Sort,这总是一件好事。 :)