2008-11-14 85 views
5

我有一個包含稱爲Room的項目的數組列表。每個房間都有房型,如廚房,接待處等。 我想檢查數組列表,查看是否有任何類型的房間存在之前,將其添加到列表中。 任何人都可以推薦一個乾淨的方式做到這一點,而不需要多個foreach循環?檢查arraylist中的重複項

(.NET 2.0)


因爲我在.NET 2.0上運行我還沒有配齊了LINQ技術。我應該在問題中說明這一點。 道歉

回答

10

我不會在這裏使用ArrayList;既然你有.NET 2.0,使用List<T>和所有變得簡單:

List<Room> rooms = ... 
string roomType = "lounge"; 
bool exists = rooms.Exists(delegate(Room room) { return room.Type == roomType; }); 

或用C#3.0(仍靶向.NET 2.0)

bool exists = rooms.Exists(room => room.Type == roomType); 

或用C#3.0,要麼LINQBridge或.NET 3.5 :

bool exists = rooms.Any(room => room.Type == roomType); 

(該Any使用將與更多類型的工作,而不僅僅是List<T>

1
if (!rooms.Any (r => r.RoomType == typeToFind /*kitchen, ...*/)) 
    //add it or whatever 
+0

啊我的道歉,我對.NET 2遺憾的是 – anonym0use 2008-11-14 11:16:36

0

我認爲使用列表和做存在的地方需要的時間是O(n)。 使用Dictionary而不是O(1),如果內存不是問題,則優先使用。

如果您不需要順序表中我會嘗試使用Dictionary這樣的:

Dictionary<Type, List<Room>> rooms = new Dictionary<Type, List<Room>>; 

void Main(){ 
    KitchenRoom kr = new KitchenRoom(); 
    DummyRoom dr = new DummyRoom(); 
    RoomType1 rt1 = new RoomType1(); 
    ... 

    AddRoom(kr); 
    AddRoom(dr); 
    AddRoom(rt1); 
    ... 

} 

void AddRoom(Room r){ 
    Type roomtype = r.GetType(); 
    if(!rooms.ContainsKey(roomtype){ //If the type is new, then add it with an empty list 
    rooms.Add(roomtype, new List<Room>); 
    } 
    //And of course add the room. 
    rooms[roomtype].Add(r); 
} 

你基本上有不同的roomtypes的列表。但是,如果你不需要數組列表,這個解決方案就可以。但對於大型列表來說,這將是最快的。

我有一個解決方案一次與List<string>與300.000 +項目。將每個元素與幾乎相同大小的其他列表進行比較需要花費12個小時才能完成。將邏輯切換爲使用字典而不是12分鐘。對於更大的名單,我總是去Dictionary<mytype, bool>其中布爾只是一個虛擬沒有被使用。

0

不使用lambda表達式:

void AddRoom(Room r, IList<Room> rooms, IDictionary<string, bool> roomTypes) 
{ 
    if (!roomTypes.Contains(r.RoomType)) 
    { 
     rooms.Add(r); 
     roomTypes.Add(r.RoomType, true); 
    } 
} 

實際上它並不不管什麼價值的字典中的類型是什麼,因爲你曾經看的唯一的事情是關鍵。

0

另一種方法是對數組進行排序,然後遍歷元素直到找到一對相鄰的重複項。把它做到最後,並且數組是無損的。

1

從你的問題來看,如果你想強制規定可能只有一個給定類型的房間,或者如果你只是想知道的話,那麼對我來說這並不是100%清楚。

如果您有一個不變量,即Room的集合可能有多個相同的Room類型,則可以嘗試使用Dictionary<Type, Room>

這樣做的好處是不會對添加進行線性搜索。

你會使用以下操作添加一個房間:

if(rooms.ContainsKey(room.GetType())) 
{ 
    // Can't add a second room of the same type 
    ... 
} 
else 
{ 
    rooms.Add(room.GetType(), room); 
}