2013-02-26 68 views
-1

我有以下對象數組,從自定義類房間創建。在我向陣列添加一個新房間之前,我想驗證房間名稱是否已經在數組中。下面是我想做一個示例:檢查對象數組中的重複項?

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 2013-02-26 21:58:28

+0

由於'roomArray'的作用域是給定的方法,而'roomArray [i] .getRoomName()'將總是拋出一個NullReferenceException - 這是你得到的錯誤嗎? – 2013-02-26 22:11:45

+0

是的!這是我不斷收到的錯誤。我有在類級別聲明的數組,但仍然得到NullReferenceException – user2101459 2013-02-27 01:48:30

回答

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擴展方法是for循環,你將需要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類需要覆蓋EqualsGetHashCode,然後用Equals檢查房間名稱是否相等。