2016-05-24 3 views
1

У меня возникло несколько проблем при создании хранения объектов в массиве и печати в C# после отладки. В чем моя проблема? Проблема возникла при добавлении объектов в массив и печати названия объекта.Массив объектов в C#

static void Main(string[] args) 
    { 
     ComputerGame cg1 = new ComputerGame("Age of Empires",49.99); 
     Console.WriteLine(cg1.title); 

     ComputerGame cg2 = new ComputerGame("Heroes and Generals", 30.00); 
     ComputerGame cg3 = new ComputerGame("Team Fortress 2", 19.50); 
     ComputerGame[] gameAlbum = new ComputerGame[5]; 
     for (int i = 0; i < 5;i++) 
     { 
      gameAlbum[0] = new ComputerGame(); 
      gameAlbum[1] = new ComputerGame(); 
      gameAlbum[2] = new ComputerGame(); 
     } 
     foreach(ComputerGame o in gameAlbum) 
     { 
      Console.WriteLine(o.title); 
     } 
    } 

public class ComputerGame 
{ 
    public string title; 
    public double price; 
    public ComputerGame(string title, double price) 
    { 
     this.title = title; 
     this.price = price; 

    } 
} 
+0

Что проблема в коде? –

+0

вы не помещаете cg1, cg2 и cg3 в объект массива gameAlbum. читая, я думаю, когда вы запускаете код, вы получаете ошибку с нулевым указателем. –

+0

Вы правильно создаете объекты, но затем вы воссоздаете gameObjects со стандартным конструктором в forloop, что означает, что все члены класса равны нулю. Подпишите и создайте экземпляры по отдельности один за другим, как вы делали до цикла –

ответ

2

ли это вместо:

static void Main(string[] args) 
{ 
    ComputerGame cg1 = new ComputerGame("Age of Empires",49.99); 
    Console.WriteLine(cg1.title); 

    ComputerGame cg2 = new ComputerGame("Heroes and Generals", 30.00); 
    ComputerGame cg3 = new ComputerGame("Team Fortress 2", 19.50); 
    ComputerGame[] gameAlbum = new ComputerGame[5]; 

    gameAlbum[0] = cg1; 
    gameAlbum[1] = cg2; 
    gameAlbum[2] = cg3; 

    foreach(ComputerGame o in gameAlbum) 
    { 
     if (o != null) 
      Console.WriteLine(o.title); 
    } 

    double total = gameAlbum.Where(g => g != null).Sum(g => g.price); 
} 

простой способ с использованием списка вместо массива:

List<ComputerGame> games = new List<ComputerGame>(); 
games.Add(new ComputerGame("Age of Empires", 49.99)); 
games.Add(new ComputerGame("Heroes and Generals", 30.00)); 
games.Add(new ComputerGame("Team Fortress 2", 19.50)); 
games.Add(new ComputerGame("Portal", 19.50)); 
games.Add(new ComputerGame("Portal 2", 29.50)); 

foreach(ComputerGame game in games) 
{ 
    if (game != null) 
     Console.WriteLine($"Title: {game.title}, Price: {game.price}"); 
} 

double total = games.Sum(p => p.price); 
+0

позволяет сказать, что я хочу отобразить общую цену в объектах, как бы я это сделал? –

+0

Для этого я бы спросил отдельный вопрос StackOverflow :-) – fuzz

+0

в порядке! Спасибо за помощь! –

0

Геймплей 0, 1 и 2 создаются с помощью безпараметрического конструктора, но для этого требуются два параметра.

Попробуйте добавить другой конструктор в свой класс или включите параметры в новые инструкции.

На боковой стенке нет причин для петли 5 раз, так как петля просто делает то же самое все время.

0

Дайте этому идти:

ComputerGame cg1 = new ComputerGame("Age of Empires",49.99); 
ComputerGame cg2 = new ComputerGame("Heroes and Generals", 30.00); 
ComputerGame cg3 = new ComputerGame("Team Fortress 2", 19.50); 

ComputerGame[] gameAlbum = new ComputerGame[5]; 
gameAlbum[0] = cg1; 
gameAlbum[1] = cg2; 
gameAlbum[2] = cg3; 

foreach(ComputerGame o in gameAlbum) 
{ 
    if (o != null) 
     Console.WriteLine(o.title); 
} 
0
ComputerGame[] gameAlbum = new ComputerGame[5]; 
     for (int i = 0; i < 5;i++) 
     { 
      gameAlbum[0] = new ComputerGame(); 
      gameAlbum[1] = new ComputerGame(); 
      gameAlbum[2] = new ComputerGame(); 
     } 

В для цикл, вы инициируете первые три элемента рвать снова и снова. Вы также вызываете конструктор по умолчанию класса ComputerGame. Таким образом, title элемент ComputerGame не будет инициализирован. Таким образом, вы не увидите ничего напечатанного на консоли.

0

Проблема с вашим кодом в том, что конструктор по умолчанию для ComputerGame переопределен. Там нет конструктора, таких как:

public ComputerGame() 
{... 
} 

Следовательно, вы можете сделать следующее:

gameAlbum[0] = new ComputerGame("Age of Empires",49.99); 
gameAlbum[1] = new ComputerGame("Heroes and Generals", 30.00); 
gameAlbum[2] = new ComputerGame("Team Fortress 2", 19.50); 

Вы также можете получить ошибки, как вы делаете использование только 3 из 5 элементов массива. Следовательно, используйте List <> вместо массивов для динамического создания объектов, когда это необходимо.

0

Я не вижу никаких назначений массиву «gameAlbum» в вашем цикле for.
Попробуйте нижеследующий и посмотрите.

static void Main(string[] args) 
{ 
    ComputerGame[] gameAlbum = new ComputerGame[3]; 

    gameAlbum[0] = new ComputerGame("Age of Empires",49.99); 
    gameAlbum[1] = new ComputerGame("Heroes and Generals", 30.00); 
    gameAlbum[2] = new ComputerGame("Team Fortress 2", 19.50); 

    foreach(ComputerGame o in gameAlbum) 
    { 
     Console.WriteLine(o.title); 
    } 
} 

public class ComputerGame 
{ 
    public string title; 
    public double price; 
    public ComputerGame(string title, double price) 
    { 
     this.title = title; 
     this.price = price; 

    } 
} 
0

Удалить для цикла. Создавайте экземпляры с такими параметрами, как вы. Подпиши в массив как gameObjs [0] = CG1 и т.д.

0

Попробуйте с этим кодом ..

Looping данные & получить сумму цены

  ComputerGame[] gameAlbum = new ComputerGame[5]; 
     gameAlbum[0] = new ComputerGame("Age of Empires", 49.99); 
     gameAlbum[1] = new ComputerGame("Heroes and Generals", 30.00); 
     gameAlbum[2] = new ComputerGame("Team Fortress 2", 19.50); 
     gameAlbum[3] = new ComputerGame("Portal", 19.50); 
     gameAlbum[4] = new ComputerGame("Portal 2", 29.50); 

     //looping the data 
     foreach (ComputerGame item in gameAlbum) 
     { 
      if (item != null) 
       Response.Write("Name : " + item.title + " Price : " + item.price); 
     } 
     //get the sum of the price 
     double total = gameAlbum.Sum(p => p.price); 
     Response.Write(total); 
+0

Можно ли использовать только массивы вместо списка? –

+0

Вы имеете в виду вместо List ? вы хотите сделать это как массив? –

+0

Исходный код использует объект массива. Список - это просто предложение @gotnull. –

Смежные вопросы