Обращение к массиву класса C#

222
27 февраля 2018, 02:41

Есть класс:

class MyFirstClass
{
    public int Id { get; set; }
    public int[] OOP { get; set; }
    public int[] arrayProgram { get; set; }
}

Есть текстовый файл:

9;44;32;95;84;72;89;12;34;88
7;32;61;45;90;53;87;22

В класс мы считываем информацию из файла в следующем методе:

MyFirstClasses = new List<StopInRoad>();
static void ReadData(out List<MyFirstClass> MyFirstClasses)
{
    MyFirstClasses= new List<MyFirstClass>();
    using (var sr = new StreamReader("../../file.txt"))
    {
        string line;
        string[] parts;
        line = sr.ReadLine(); // считываем новую строку 
        parts = line.Split(';'); // сплитим строку
        int countOOP = int.Parse(parts[0]); // количество элементов в int-овом массиве
        int[] oop = new int[countOOP]; // создаём новый массив с размером, который только что считали
        for (int i = 0; i < countOOP; i++) // пробегаем циклом по массиву, добавляя в него элементы строки по порядку, начиная со второго
        {
            oop[i] = int.Parse(parts[(i + 1)]); // добавляем в массив элементы строки по порядку, начиная со второго
        };
        line = sr.ReadLine(); // считываем новую строку
        parts = line.Split(';'); // сплитим строку
        int countProgram = int.Parse(parts[0]); // количество элементов в массиве arrayProgram
        int[] arrayProgram = new int[countProgram];
        for (int i = 0; i < countStops; i++) // пробегаем циклом по массиву, добавляя в него элементы строки по порядку, начиная со второго
        {
            arrayProgram[i] = int.Parse(parts[(i + 1)]); // добавляем в массив элементы строки по порядку, начиная со второго
        };
        var MyFirstClass = new MyFirstClass // переменной MyFirstClass присваиваем все значения класса MyFirstClass
        {
            Id = 1,
            OOP = oop,
            arrayProgram = arrayProgram
        };
        MyFirstClasses.Add(MyFirstClass); // добавляем все данные в List MyFirstClass       
    }
    Console.WriteLine();
}

Вопросы:

  • Как из метода Main и из другого метода обратиться к переменной Id и массиву OOP класса MyFirstClass по индексу?

  • Как сделать метод, который вызывался бы из класса Main и выводил в консоль все элементы массивов по порядку?

  • Создать метод, который будет находить сумму всех элементов массива до второго элемента. На вход массив с элементами, на выход найденная сумма типа int

Answer 1

Я не уверен, что вы именно эту логику хотели реализовать, но теме не менее вот что у меня получилось:

void Main()
{
    var data = ReadDataFromFile(@"C:\downloads\asdf123.txt");
    foreach (var element in data)
    {
        PrettyPrint(element);
        Console.WriteLine();
    }
}
public void PrettyPrint(MyFirstClass element)
{
    Console.WriteLine("element id is {0}", element.Id);
    Console.WriteLine("oop:");
    foreach (var el in element.OOP)
    {
        Console.WriteLine(el);
    }
    Console.WriteLine("arrayProgram:");
    foreach (var el in element.arrayProgram)
    {
        Console.WriteLine(el);
    }
}
public static List<MyFirstClass> ReadDataFromFile(string filename)
{
    var result = new List<MyFirstClass>();
    var strings = File.ReadLines(filename);
    using (var sr = new StreamReader(filename))
    {
        var oop = ParseLine(sr.ReadLine());
        var arrayProgram = ParseLine(sr.ReadLine());
        var MyFirstClass = new MyFirstClass
        {
            Id = 1,
            OOP = oop,
            arrayProgram = arrayProgram
        };
        result.Add(MyFirstClass);
    }
    return result;
}
public static int[] ParseLine(string line)
{
    var parts = line.Split(';');
    int countOOP = int.Parse(parts[0]); //int countOOP = parts.Length - 1;
    int[] result = new int[countOOP];
    for (int i = 0; i < countOOP; i++)
    {
        result[i] = int.Parse(parts[(i + 1)]);
    };
    return result;
}
// Define other methods and classes here
public class MyFirstClass
{
    public int Id { get; set; }
    public int[] OOP { get; set; }
    public int[] arrayProgram { get; set; }
}

Повыше функция печати вашего списка (напрашивался массив MyFirstClass[] но оставил для наглядности как было.

Также вызывает вопросы необходимость расчёта countOOP - если мы знаем размер после split'а - и можем рассчитать. Представьте, что у вас весь файл бы из строк вида 44;32;95;84;72;89;12;34;88|32;61;45;90;53;87;22 - разве не удобнее?

Не уверен, что в файле будет только две строки, напрашивалось прочитать весь файл в цикле.

Ну и разбил код на отдельные функции для облегчения понимания.

Update. Суммирование первых числе массива: классический способ и через linq:

// Вариант 1
public int Sum1(int[] arr, int count)
{
    var result = 0;
    for(var i = 0; i < count; i++)
        result += arr[i];
    return result;  
}
// Вариант 2
public int Sum2(int[] arr, int count)
{
    return arr.Take(count).Sum();
}

Например

var oop = new[] {44, 32, 95, 84, 72, 89, 12, 34, 88};
var sum = Sum1(oop, 2);

выведет 76.

READ ALSO
Unity(C#) — Почему не работают корутины?

Unity(C#) — Почему не работают корутины?

Недавно начал изучать корутиныНе совсем понимаю, как они работают

217
Верстка DataGrid В XAML

Верстка DataGrid В XAML

Как реализовать таблицу такого вида на XAML? Туплю конкретноЕсли не сложно, можно готовый код или ссылку на статью, где подобное подробно описывается

214
Сокеты, выход за границы массива?

Сокеты, выход за границы массива?

Люди добрые, осваиваю сокеты на c#, и увидел товарища на ютюбе, который объясняет как это делатьВообщем, когда он принимает сообщение от клиента(простая...

145
LINQ to XML: парсинг xml с отсутствующими тегами

LINQ to XML: парсинг xml с отсутствующими тегами

Есть некий xmlВ целом его структура "постоянна", но есть узлы, в которых нет части тегов, которые необходимо считать

168