3

Room オブジェクトのリストがあり、各 Room オブジェクトには Building 属性があります。

 public class Room
{
      public string BuildingName;
      public string Name 
}

各建物から 1 つの部屋のみを取得するコレクションをフィルター処理したい (どの建物でも構いません)

たとえば

 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 つの項目 (各建物から 1 つ) を含む配列を返す関数を使用して、このリストを実行します。

4

2 に答える 2

4

LINQは、この種のタスクに非常に便利です。

var result = ListofRooms.GroupBy(room => room.BuildingName)
                        .Select(buildingGroup => buildingGroup.First())
                        .ToList();

これは、建物ごとにバケットを作成し(建物内の部屋で構成されます)、選択した部屋をコレクションに具体化する前に、各バケットから部屋を選択します。

いくつかの接線点:

  1. 標準のC#命名規則では、ローカル変数はlistOfRoomsPascalCase()ではなくcamelCase()で名前を付ける必要があります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);
    }
}
于 2013-03-09T04:52:46.713 に答える
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();
    }
}

このアプローチは、PITA である実装を作成する必要があるため、実際にはめったに使用されませんがIEqualityComparer、必要なものを達成するための別の方法にすぎないため、気に入った場合や簡単に見つけた場合は、使用してください!!!

于 2013-03-09T05:43:03.710 に答える