代码之家  ›  专栏  ›  技术社区  ›  anonym0use

检查arraylist中的重复项

  •  5
  • anonym0use  · 技术社区  · 17 年前

    我有一个数组列表,其中包含名为room的项。每个房间都有一个房间类型,如厨房、接待处等。 我想先检查arraylist,看看是否存在这种类型的房间,然后再将其添加到列表中。 有人能推荐一种不需要多个foreach循环的简洁方法吗?

    (.NET 2)


    我没有像在.NET 2.0上运行那样使用Linq技术。我应该在这个问题上说明这一点。 道歉

    6 回复  |  直到 14 年前
        1
  •  10
  •   Marc Gravell    17 年前

    我不会使用 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);
    

    (the Any 使用将适用于更多类型,而不仅仅是 列表& T; )

        2
  •  1
  •   Bluenuance    17 年前
    if (!rooms.Any (r => r.RoomType == typeToFind /*kitchen, ...*/))
      //add it or whatever
    
        3
  •  1
  •   Kennet Belenky    17 年前

    从你的问题来看,我并不完全清楚,如果你想执行这样的规则,即一个给定类型的房间可能只有一个,或者你只是想知道。

    如果你有不变量,没有集合 Room S可以有多个相同的 房间 类型,您可以尝试使用 Dictionary<Type, Room> .

    这样做的好处是不在“添加”上执行线性搜索。

    您可以使用以下操作添加房间:

    if(rooms.ContainsKey(room.GetType()))
    {
       // Can't add a second room of the same type
       ...
    }
    else
    {
       rooms.Add(room.GetType(), room);
    }
    
        4
  •  0
  •   Robert Rossney    17 年前

    不使用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
  •   David Grant    17 年前

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

        6
  •  0
  •   Jason Plank Maksim Kondratyuk    14 年前

    我认为使用列表和做存在于一个需要 O(n) 时间。 使用 Dictionary 相反的是 O(1) 如果内存不是问题,则首选。

    如果您不需要序列列表,我将尝试使用 词典 这样地:

    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);
    }
    

    你基本上有一个不同房间类型的列表。但只有当你不需要数组列表时,这个解决方案才是可以的。但对于大名单来说,这将是最快的。

    我曾经有过一次 List<string> 30万件以上。将每个元素与另一个几乎相同大小的列表进行比较需要12个小时。将逻辑改为使用字典,并减少到12分钟。对于更大的名单,我总是去 Dictionary<mytype, bool> 其中bool只是一个没有被使用的假人。

    推荐文章