#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.List1[System.String]' is the expected behaviour. Please look up the
toString` в документах, так как это важно понимать! Также ключевое слово:override ToString()
Вы вызываетеnew List<string>().ToString()
, а не метод lists itemsToString()
! Вам понадобится что-то вроде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<>
И, что вы подразумеваете под «столбцами»?