在C#中,从这个集合中筛选出最好的方式是什么?

3
我有一个房间对象列表,每个房间对象都有一个Building属性;
 public class Room
{
      public string BuildingName;
      public string Name 
}

我现在希望筛选我的集合,只选择每个建筑物中的一个房间(我不关心是哪个)。
例如:
 var room = new Room(){BuildingName ="Building 1", Name = "Room 1"};
 var room2 = new Room(){BuildingName ="Building 1", Name = "Room 2"};
 var room3 = new Room(){BuildingName ="Building 2", Name = "Room 3"};
 var room4 = new Room(){BuildingName ="Building 2", Name = "Room 4"};
 var room5 = new Room(){BuildingName ="Building 2", Name = "Room 5"};

 var ListofRooms = new List<Room> {room, room2, room3, room4, room5};

在这种情况下,我希望运行此列表通过一个函数,该函数将返回一个包含两个项的数组(每个建筑物的一个项)。
2个回答

4
LINQ在这种任务中非常方便:
var result = ListofRooms.GroupBy(room => room.BuildingName)
                        .Select(buildingGroup => buildingGroup.First())
                        .ToList();

这个代码的作用是为每个楼房(由楼房内的房间组成)创建一个桶,然后从每个桶中选择一个房间,并最终将所选的房间实现为一个集合。
一些相关点:
1. 标准的C#命名约定要求本地变量应该使用camelCase(listOfRooms),而不是PascalCase(ListofRooms)。
2. 如果你喜欢,可以去掉对象初始化器中无参数构造函数的括号,像这样:new Room { BuildingName = "Building 1", Name = "Room 1" } 如果你不想使用LINQ进行此操作,我会这样做:
var seenBuildingNames = new HashSet<string>();
var result = new List<Room>();

foreach(var room in ListofRooms)
{
    if(seenBuildingNames.Add(room.BuildingName))
    {
        // First time we are encountering this building; add room to result.
        result.Add(room);
    }
}

0
你可以使用以下方法:
var result = ListofRooms.Distinct(new BuildingEqualityComparer());

而类BuildingEqualityComparer如下:

public class BuildingEqualityComparer : IEqualityComparer<Room>
{
    public bool Equals(Room x, Room y)
    {
        return x.BuildingName.Equals(y.BuildingName);
    }

    public int GetHashCode(Room obj)
    {
        return obj.BuildingName.GetHashCode();
    }
}

这种方法实际上很少使用,因为你需要实现一个 IEqualityComparer 接口,这是一件非常麻烦的事情,但这只是另一种实现你所需功能的方式,所以如果你喜欢它或者觉得它更简单,请使用它!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接