2013-02-26 2 views
-1

У меня есть следующий массив объектов, созданный из пользовательского класса Room. Прежде чем я добавлю новый номер в массив, я хочу проверить, что имя комнаты еще не находится в массиве. Вот пример того, что я пытаюсь:Проверка дубликатов в массиве объектов?

private void btnAddRm_Click(object sender, EventArgs e) 
{ 
Room[] roomArray = new Room[20]; 
test = txtName.text; 

for (int i = 0; i < roomArray.length; i++) 
{ 
    if(test != roomArray[i].getRoomName()) 
    { 
      addRoom(); 
    } 
} 
} 

GetRoomName() является сбруя, который извлекает RoomName из класса. На мой вопрос, почему этот код не работает?

Спасибо

+2

Что с этим не связано? – gdoron

+0

Поскольку 'roomArray' привязан к данному методу, а' roomArray [i] .getRoomName() 'всегда будет вызывать исключение NullReferenceException - это ошибка, которую вы получаете? –

+0

да! это ошибка, которую я продолжаю получать. У меня есть массив, объявленный на уровне класса, и до сих пор я получаю исключение NullReferenceException – user2101459

ответ

0

Ваш код срабатывает addRoom() каждый раз, когда есть несоответствующий номер в текущем массиве.

Я думаю, вы ищете что-то вроде этого:

if(!roomArray.Any(r => r.getRoomName() == test)) 
    addRoom(); 

или используя All метод:

1

Ваш текущий код добавит комнату, как только название комнаты Безразлично» t равна новой комнате. Вместо этого, сначала проверьте, что ни один номера имеют существующее имя и только тогда добавить:

private void btnAddRm_Click(object sender, EventArgs e) 
{ 
    Room[] roomArray = new Room[20]; 
    test = txtName.text; 
    bool exists = false; 

    for (int i = 0; i < roomArray.length; i++) 
    { 
     if (test == roomArray[i].getRoomName()) 
     { 
       exists = true; 
       break; 
     } 
    } 
    if (!exists) 
    { 
     addRoom(); 
    } 
} 
0

Вы должны закончить цикл через весь массив перед добавлением новой комнаты. С тем, что у вас есть, если у вас есть новое имя комнаты, которое не соответствует существующим комнатам, он будет звонить addRoom() 20 раз.

Room[] roomArray = new Room[20]; 
test = txtName.text; 

bool doesRoomExist = false; 
for (int i = 0; i < roomArray.length; i++) 
{ 
    if (test == roomArray[i].getRoomName()) 
    { 
     doesRoomExist = true; 
     break; 
    } 
} 

if (!doesRoomExist) 
    addRoom(); 

Вы также можете конденсироваться вы цикл, используя метод Any расширения, вам необходимо using System.Linq сделать это.

if (!roomArray.Any(room => room.GetRoomName() == test)) 
    addRoom(); 
0

Как и другие, уже заявленные, ваш код не имеет никакого смысла. Вы создаете массив комнат, оставляя все элементы неинициализированными (null). Затем вы проверяете наличие комнаты внутри этого массива. Также в вашем цикле вы «добавляете» новую комнату каждый раз, когда элемент имеет другое имя. Я не знаю, как вы хотите добавить что-то в массив, который выходит за рамки вашего метода addRoom. Надеюсь, это не ваш реальный код!

Таким образом, прежде всего массив комнат должен быть создан как поле вашего класса за пределами метода btnAddRm_Click.

Поскольку вы хотите, чтобы добавить номеров, вы не должны использовать массив. Вместо этого используйте List<Room>. В противном случае вам нужно будет узнать, сколько элементов вашего массива уже инициализировано комнатой. Также вам нужно будет увеличить массив, если число превышает начальный размер массива. Это именно то, что может сделать для вас List<Room>.

Обработчик события btnAddRm_Click может использовать LINQ для проверки наличия какой-либо комнаты с тем же именем. Обратите внимание, что вы должны использовать String.Compare(name1, name2) вместо name1 == name2.

private List<Room> _theRooms = new List<Room>(); 

private void btnAddRm_Click(object sender, EventArgs e) 
{ 
    if (!_theRooms.Any(r => string.Compare(r.Name, txtName.Text, StringComparison.CurrentCultureIgnoreCase) == 0)) 
    { 
     addRoom(); 
    } 
} 

Предполагая, что имя номер какой-то уникальный ключ для номеров вы можете также использовать HashSet<Room>, а затем добавить в комнату в любом случае. HashSet будет проверять наличие комнаты. Ваш класс Room, однако, должен перезаписать Equals и GetHashCode, а затем с Equals проверить на равенство имен комнат.

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