2016-09-23 3 views
0

Я пытался выполнить простую задачу на C#, поместить объекты в список, я сделал это раньше, но никогда не сталкивался с этой проблемой. После нескольких поисков, столкнувшихся с людьми с аналогичными проблемами и некоторыми решениями, но никто не исправил мою проблему, вот код.Список содержит повторяющиеся элементы

static void GenerateRooms(int RoomsNumber) 
    { 
     int randomWidth; 
     int randomHeight; 
     Room newRoom = null; 
     for (int i = 0; i < RoomsNumber; i++) 
     { 
      //Create new rooms and store it on the list 
      randomWidth = rand.Next(_MinRoomW, _MaxRoomW + 1); 
      randomHeight = rand.Next(_MinRoomH, _MaxRoomH + 1); 

      //Room(x, y, id) 
      newRoom = new Room(randomWidth, randomHeight, i); 

      //1 
      _RoomsL.Insert(i, newRoom); 
     } 
    } 

После комментария 1, я на самом деле поиска в списке, и все объекты есть, от 0 до последнего, но когда я выйти из этой функции в любой другой, например, что один, например:

static void CheckList() 
    { 
     foreach(Room nextRoom in _RoomsL) 
     { 
      Console.WriteLine(" This room have the id: " + nextRoom.GetId()); 
     } 
    } 

Все объекты в этом списке имеют одинаковый идентификатор, в этом случае идентификатор равен последнему объекту добавляется в списке на первом методе ...

Так его так:

 GenerateRooms(RoomsNumber); << at the end of this function, the list is ok. 

     CheckList(); << just after exiting the last function and checking the same list, all the objects are the same. 

Я тоже пробовал использовать list.Insert, но ничего не менял. Я действительно не знаю, что делать.

Класс помещения.

class Room 
{ 
    //This is random. 
    public static Random rand = new Random(); 

    //Room variables 
    public static int rWIDTH, rHEIGHT; 
    public static int ROOMID; 

    public Room(int X, int Y, int id) 
    { 
     rWIDTH = X; 
     rHEIGHT = Y; 
     ROOMID = id; 
    } 

    public int GetWidth() 
    { 
     return rWIDTH; 
    } 

    public int GetHeight() 
    { 
     return rHEIGHT; 
    } 

    public int GetId() 
    { 
     return ROOMID; 
    } 

} 
+7

Не могли бы вы разместить свой метод Room.GetId()? Это было бы полезно. – c0d3b34n

+1

или класс комнаты –

+1

Почему каждый метод статичен? Не похоже, что у вас есть материал без гражданства внутри вас, поэтому все статичное не может быть хорошим дизайном. Во всяком случае, это не платформа для просмотра кода ;-) – Mat

ответ

3
public static int ROOMID; 

Если это статическая переменная, она сохраняется через любой экземпляр класса. Поэтому сделайте его нестатичным.

Я предлагаю вам переделывать свой код, чтобы выглядеть как стандартизированный C# класса:

Сначала переместил случайный переменный rand в класс вызова (так удалить его из комнаты)

Тогда для вашего класса номера:

public class Room 
{ 

    //Room variables 
    public int Width {get;set;} 
    public int Height {get;set;} 
    public int RoomID {get;set;} 

    public Room(int width, int height, int id) 
    { 
     Width = width; 
     Height = height; 
     RoomID = id; 
    } 

} 

и получить свойства, как это:

Room room = new Room(width,height,id); 
Console.WriteLine(room.Width+" is the room width"); 

и т. Д.

+3

Сделать все переменные нестатичными :-) – c0d3b34n

+2

ok Я просто чувствую себя таким глупым сейчас xD, я сделал ту же ошибку, когда начал программировать, а теперь уже почти 3 года, вот и снова. код работает сейчас, и я буду реализовывать ваши предложения, спасибо вам большое. :) (мне нужно немного поспать) – JeffCarvalho

+0

Нет проблем @JeffCarvalho, я также написал предложение о том, как вы должны написать свой класс, если хотите, чтобы он выглядел немного больше, как стандартный код C# :). – Tyress

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