Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中,从这个集合中过滤出来的最佳方法是什么?_C#_Collections - Fatal编程技术网

C# 在C语言中,从这个集合中过滤出来的最佳方法是什么?

C# 在C语言中,从这个集合中过滤出来的最佳方法是什么?,c#,collections,C#,Collections,我有一个房间对象列表,每个房间对象都有一个建筑属性 public class Room { public string BuildingName; public string Name } 我现在想过滤我的收藏,我只从每栋楼拿走一个房间,我不在乎哪一个 比如说 var room = new Room(){BuildingName ="Building 1", Name = "Room 1"}; var room2 = new Room(){BuildingNam

我有一个房间对象列表,每个房间对象都有一个建筑属性

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

在本例中,我希望通过一个函数运行此列表,该函数将返回一个包含两个项目的数组,每个建筑一个项目

var result = ListofRooms.GroupBy(room => room.BuildingName)
                        .Select(buildingGroup => buildingGroup.First())
                        .ToList();
这样做的目的是为包含建筑中房间的每个建筑创建一个bucket,然后从每个bucket中选择一个房间,最后将所选房间具体化为一个集合

一些切点:

标准C命名约定规定,局部变量应在camelCase listOfRooms中命名,而不是在PasCalcalCaseListofRooms中命名。 如果愿意,可以在对象初始值设定项中消除无参数构造函数的偏执,如下所示: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);
    }
}

您可以使用这种方法:

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,但它只是实现您所需的另一种方法,所以如果您喜欢它或觉得它更简单,请使用它