Как добавить более одного элемента в мой список / массив в C # во время чтения файла, чтобы я мог печатать все в одной строке на строку текста?

#c# #visual-studio

#c# #visual-studio

Вопрос:

Помогите мне узнать, как добавить весь созданный мной массив в одну строку, похоже, что изменение int на double приводит к большим ошибкам, поэтому сейчас я просто хочу попытаться добавить все во всей строке.

Кажется, когда я пытаюсь добавить массив, он выводит имя массива, когда я пытаюсь распечатать имя экземпляра массива, он выводит путь к файлу, когда я добавляю разделенный массив [0], он успешно печатает первый элемент в массиве. Как я могу добавить весь массив, а не только первый элемент? Вот как выглядит текст:

обычный, хлеб, 2,00, 2
обычный, молоко, 2,00, 3

Это то, как я хочу, чтобы это выглядело после кодирования

обычный, хлеб, 2.00,2, (результат 2 * 2 * GST)
обычный, молоко, 2.00,3, (результат 2 * 3 * GST)

Это то, что я понимаю (не нужно показывать обычную строку стоимости товара):

Система.Коллекции.Generic.List`1[System.Строка]
RegularItemCost:
4.4

Это код, который я получил для чтения, а также метод и конструкторы для вычислений:

             public List<string> readFile()
        {
            string line = "";
            StreamReader reader = new StreamReader("groceries.txt"); //variable reader to read file
            while ((line = reader.ReadLine()) != null) //reader reads each line while the lines is not blank, line is assigned value of reader
            {
                line = line.Trim();     //gets rid of any spaces on each iteration within the line

                if (line.Length > 0) //during  each line the below actions are performed
                {
                    string[] splitArray = line.Split(new char[] { ',' });  //creates a array called splitArray which splits each line into an array and a new char

                    type = splitArray[0]; // type is assigned for each line at position [0] on 
                    name = splitArray[1]; //name is assigned at position [1]

                    //<<<-------food cost calculation methods initialized-------->>>>
                    RegularItem purchasedItem = new RegularItem(splitArray); //purchased Item is the each line to be printed
                    FreshItem freshItem = new FreshItem(splitArray);



                    double regCost = purchasedItem.getRegularCost();  //regCost will multiply array at position [2] with [3]
                    double freshCost = freshItem.getFreshItemCost();
                    string[] arrayList = { Convert.ToString(regCost), Convert.ToString(freshCost) };
                    List<string> newArray = new List<string>(splitArray);
                    newArray.AddRange(arrayList);


                    if (type == "regular")
                    {
                        // items.InsertRange(4, (arrayList)); //first write a line in the list with the each line written
                        items.Add(Convert.ToString(newArray));
                        items.Add("RegularItemCost:");
                        items.Add(Convert.ToString(regCost));  //next add the regCost method to write a line with the cost of that item
                    }
                    else if (type == "fresh")
                    {
                        items.Add(Convert.ToString(freshItem)); //first write a line in the list with the each line written
                        items.Add("FreshItemCost:");
                        items.Add(Convert.ToString(freshCost));  //next add the fresh method to write another line with the cost of that item
                    }
                }
            }
            return items;
        }
  

// конструктор и метод

             public class RegularItem : GroceryItem //inheriting properties from class GroceryItem
        {

            private string[] splitArray;

            public RegularItem()
            {
            }

            public RegularItem(string[] splitArray) //enables constructor for RegularItem to split into array
            {
                this.type = splitArray[0];
                this.name = splitArray[1];
                this.price = double.Parse(splitArray[2]); //each line at position 4 is a double
               this.quantity = double.Parse(splitArray[3]); //each line at position 3 is parsed to an integer
            }

            public double getRegularCost() //method from cost of regular
            {
                return this.price * this.quantity * 1.1; //workout out cost  for purchases including GST
            }
        }
  

Комментарии:

1. Convert.ToString(newArray) это очень похоже newArray.ToString() на, так что ваша система вывода. Коллекции. Метод Generic.List 1[System.String]' is the expected behaviour. Please look up the toString` в документах, так как это важно понимать! Также ключевое слово: override ToString() Вы вызываете new List<string>().ToString() , а не метод lists items ToString() ! Вам понадобится что-то вроде newArray.ForEach(x => items.Add(x.ToString())) — но поскольку я действительно не знаю желаемого результата, вам нужно будет это адаптировать.

Ответ №1:

Хорошо, несколько вещей. Во-первых, хотя это неплохо использовать Convert. ToString() , я думаю, что лучше просто сделать . ToString . Помните, что все объекты наследуются от object , поэтому все объекты будут иметь этот метод.

Если вы хотите, чтобы все значения коллекции были «объединены» в одну строку, которую лучше использовать string. Join() , посмотрите на нее, вы можете указать разделитель для использования между значениями. Если вы просто используете Convert. ToString() непосредственно в списке, он просто печатает информацию о самом объекте списка, а не о значениях внутри списка.

Далее, если вы используете ToString или Convert. ToString со встроенным типом, таким как int или double , он будет печатать число в виде строки, но если вы сделаете это со своим пользовательским объектом или просто с более сложным объектом, например List , он просто напечатает информацию о типе. Чтобы решить эту проблему в ваших пользовательских объектах (например RegularItem , например), вы должны переопределить ToString() метод и код, который вы хотите распечатать при вызове метода. Таким образом, вы можете переопределить метод и поместить его туда, чтобы распечатать пример cost dor.

Комментарии:

1. Я пробовал toString, но, похоже, не удается преобразовать из группы методов в строку :/

2. С другой стороны…. Я считаю, что справка сработала со строкой. Join()!!! по какой-то причине, похоже, ему не нравятся массивы и списки: ( но в любом случае я решил этот код по большей части yipeee! теперь просто нужно выяснить, как добавить столбцы вместе.

3. string.Join() должен принимать как список, так и массив, он принимает любую реализацию класса IEnumerable<> И, что вы подразумеваете под «столбцами»?