我有一個包含稱爲Room的項目的數組列表。每個房間都有房型,如廚房,接待處等。 我想檢查數組列表,查看是否有任何類型的房間存在之前,將其添加到列表中。 任何人都可以推薦一個乾淨的方式做到這一點,而不需要多個foreach循環?檢查arraylist中的重複項
(.NET 2.0)
因爲我在.NET 2.0上運行我還沒有配齊了LINQ技術。我應該在問題中說明這一點。 道歉
我有一個包含稱爲Room的項目的數組列表。每個房間都有房型,如廚房,接待處等。 我想檢查數組列表,查看是否有任何類型的房間存在之前,將其添加到列表中。 任何人都可以推薦一個乾淨的方式做到這一點,而不需要多個foreach循環?檢查arraylist中的重複項
(.NET 2.0)
因爲我在.NET 2.0上運行我還沒有配齊了LINQ技術。我應該在問題中說明這一點。 道歉
我不會在這裏使用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>
)
if (!rooms.Any (r => r.RoomType == typeToFind /*kitchen, ...*/))
//add it or whatever
我認爲使用列表和做存在的地方需要的時間是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>
其中布爾只是一個虛擬沒有被使用。
不使用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);
}
}
實際上它並不不管什麼價值的字典中的類型是什麼,因爲你曾經看的唯一的事情是關鍵。
另一種方法是對數組進行排序,然後遍歷元素直到找到一對相鄰的重複項。把它做到最後,並且數組是無損的。
從你的問題來看,如果你想強制規定可能只有一個給定類型的房間,或者如果你只是想知道的話,那麼對我來說這並不是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);
}
啊我的道歉,我對.NET 2遺憾的是 – anonym0use 2008-11-14 11:16:36