C # чтение файла в двумерный массив - PullRequest
2 голосов
/ 21 февраля 2011

мой проект использует txt файл как db, каждая строка в txt файле будет выглядеть примерно так: «abc, cdf, ghi, zkl»

теперь я читаю построчно из текстового файла и разделяюстрока в массив data [] с помощью ",", но я хочу поместить этот массив в другой основной массив с именем datas [], чтобы я мог сохранить этот массив datas [] в памяти для использования всем классом,

Я не хочу исправлять размер массива datas [], так как записи в текстовом файле будут расти.

что я могу сделать в этом случае?Я попытался сделать данные [] в качестве arraylist, а затем сохранить массив данных [], но ошибка показала.

class user
{
    ArrayList userDatas = new ArrayList();

    public user()
    {
        readUsers();
    }

    public void readUsers()
    {
        string line;

        StreamReader sr = new StreamReader("user.txt", System.Text.Encoding.Default);

        while ((line = sr.ReadLine()) != null)
        {
            ArrayList temp = new ArrayList();
            string[] rc = line.Split('|');
            for (int i = 0; i < rc.Length; i++)
            {
                temp.Add(rc[i]);

            }
            userDatas.Add(temp);
        }

    }

    public bool login(string ic, string password)
    {
        for (int i = 0; i < userDatas.Count; i++)
        {
            ArrayList temp = userDatas;
            if ((temp[1] == ic) && (temp[2] == password))
            {
                return true;
            }
        }
        return false;
    }
}

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Конечно, если вы не возражаете быть немного милым, вы можете сделать это с помощью одной строки LINQ:

string[][] LinesSplitByComma = File.ReadAllLines("file path").Select(s => s.Split(',')).ToArray();
0 голосов
/ 21 февраля 2011

Вместо ArrayList используйте List<string> для температуры и List<string[]> для userDatas.

Когда вы закончите заполнять их, вы можете преобразовать в массив, просто вызвав userDatas.ToArray()

Также ваша ошибка может быть здесь:

ArrayList temp = userDatas;
if ((temp[1] == ic) && (temp[2] == password))
{
      return true;
}

Вы не проверяете сначала, чтобы убедиться, что у temp есть 3 или более элементов, прежде чем ссылаться на индексы 1 и 2. Кроме того, почему вы создаете temp только для присвоения его userDatas? Почему бы просто не сказать:

if (userDatas.Count() >= 3 && (userDatas[1] == ic) && (userDatas[2] == password))
   return true;

EDIT

В соответствии с запросом, вот мой оригинальный код, хотя большая часть его уже написана, но вот он (ваш код сначала не отображался):

        StreamReader reader = new StreamReader();
        List<string[]> datas = new List<string[]>();
        List<string> data = new List<string>();
        string line;
        while (!reader.EndOfStream) {
            line = reader.ReadLine();
            datas.Add(line.Split(','));
        }

        string[] datas_array = datas.ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...