检查arraylist中的重复项

时间:2008-11-14 11:08:48

标签: c# .net asp.net

我有一个arraylist,其中包含名为Room的项目。每个房间都有房型,如厨房,接待处等。 我想在将它添加到列表之前检查arraylist以查看是否存在该类型的任何房间。 任何人都可以推荐一种简洁的方法,而不需要多个foreach循环吗?

(。NET 2.0)


我在.net 2.0上运行时无法访问linq技术。我应该在问题中说明。 道歉

6 个答案:

答案 0 :(得分: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 :(得分:1)

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

答案 2 :(得分: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);
}

答案 3 :(得分: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);
}

你基本上有一个不同的房型列表。但是这个解决方案只有在你不需要arraylist时才可以。但对于大型列表,这将是最快的。

我有一个解决方案,List<string>有300.000 +项。将每个元素与另一个几乎相同大小的列表进行比较需要大量的12小时才能完成。将逻辑切换为使用Dictionary而不是12分钟。对于较大的列表,我总是去Dictionary<mytype, bool>,其中bool只是一个不使用的假人。

答案 4 :(得分: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);
   }
}

字典中值的类型实际上并不重要,因为你唯一看到的就是键。

答案 5 :(得分:0)

另一种方法是对数组进行排序,然后遍历元素,直到找到一对相邻的重复项。使它到最后,阵列是无欺骗的。