Многомерные массивы C #, такие как PHP

Я пытался сделать это в течение 6 часов, и я в тупике.

Я хочу эквивалент этого в C #:


    $settings = array();
    foreach(file('settings.txt') as $l) $settings[]=explode(',',$l);
    print $settings[0][2];

Это то, что у меня до сих пор, что не работает:


    string fileName = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\" + "settings.txt";
    string[,] settings;

    FileStream file = null;
    StreamReader sr = null;

    try
    {
        file = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Read);
        sr = new StreamReader(file, Encoding.ASCII);
        string[] line;
        int i = 0;
        do
        {
            line = sr.ReadLine().Split(',');
            settings[i++, 0] = line[0];
        } while (line != null);
        file.Close();

        MessageBox.Show(settings[1, 0]);
    } catch (Exception err) { MessageBox.Show(err.Message); }

Я получаю «Ссылка на объект, не установленную на экземпляр объекта», любые идеи были бы с благодарностью.

c#,arrays,

4

Ответов: 6


7 принят

Используйте неровный массив вместо многомерного - или еще лучше List<string[]>: a :

var settings = new List<string[]>();

foreach (string line in File.ReadLines("settings.txt", System.Text.Encoding.ASCII))
    settings.Add(line.Split(','));

Использование Марком LINQ вместо цикла является хорошей альтернативой.


3

Сначала вы должны инициировать свой массив следующим образом:

string[,] settings = new string[3,3];

EDIT: Также по этой строке вы пропустите, чтобы установить первый элемент массива:

settings[i++, 0] = line[0];

Вы должны присвоить свое значение следующим образом:

settings[i, 0] = line[0];
i++;

3

Если вы собираетесь посмотреть на множество разных ячеек:

    string[][] lines = File.ReadAllLines(path).Select(
        line => line.Split(',').ToArray()).ToArray();
    Console.WriteLine(lines[0][2]);

Если вы хотите только [0] [2], вы можете немного ограничить его ...

    using (StreamReader sr = File.OpenText(path))
    { // only read the first line (zero)
        Console.WriteLine(sr.ReadLine().Split(',')[2]);
    }

3

Ну, это даже не нужно компилировать - вы никогда не инициализируете значение settings. Массивы в .NET имеют фиксированный размер - мне кажется, что вы должны быть List <string []> a вместо:List<string> settings = new List<string>(); using (TextReader reader = File.OpenText(fileName, Encoding.ASCII)) { string line; while ((line = reader.ReadLine()) != null) { settings.Add(line.Split(',')); } } MessageBox.Show(settings[1][0]); // Shows the first part of the second line

using

(Обратите внимание, что это также гарантирует, что файл будет закрыт, даже если будут возникать исключения - вам обязательно нужно узнать об этом usingзаявлении. Решение Marc избегает этого, загружая все строки в один вызов, что, очевидно, имеет накладные расходы памяти, но в остальном это хорошо. )


0

Спасибо за супер быстрые ответы!

Я решил:


    List settings = new List();
    foreach (string line in File.ReadAllLines("settings.txt", System.Text.Encoding.ASCII)) settings.Add(line.Split(','));

Благодаря!

Дин.

C #, массивы,
Похожие вопросы
Яндекс.Метрика