我有一个Room对象列表,每个room对象都有一个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个项目的数组(每个建筑物一个)
答案 0 :(得分:4)
LINQ对于这类任务非常方便:
var result = ListofRooms.GroupBy(room => room.BuildingName)
.Select(buildingGroup => buildingGroup.First())
.ToList();
这样做是为每个建筑物(包括建筑物中的房间)创建一个水桶,然后从最后一个房间中选择一个房间,最后将所选房间物化为一个集合。
一些切向点:
listOfRooms
)命名,而不是PascalCase(ListofRooms
)。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);
}
}
答案 1 :(得分: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
这是一个PITA,但它只是实现你需要的另一种方式,所以如果你喜欢它或者发现它更简单,那就用它吧!!!