0

私が2つの配列を持っていると仮定します:

Dim RoomName() As String = {(RoomA), (RoomB), (RoomC), (RoomD), (RoomE)}
Dim RoomType() As Integer = {1, 2, 2, 2, 1} 

「 RoomType」配列の基準に基づいて「 RoomName 」配列から値を取得したい。たとえば、 「 RoomType = 2 」の「 RoomName」を取得したいので、アルゴリズムは「RoomType 」が「2」である配列のインデックスをランダム化し、インデックス「 1〜3」から単一の値の範囲を取得する必要があります。 " それだけ。

配列を使用して問題を解決するための可能な方法はありますか、またはこれを行うためのより良い方法はありますか?どうもありがとうございました:)

4

1 に答える 1

1

注:以下のコード例ではC#を使用していますが、vb.netのインテントを読むことができれば幸いです。

もっと簡単な方法は、nameプロパティとtypeプロパティの両方を含む構造/クラスを作成することです。

  public class Room
  {
      public string Name { get; set; }
      public int Type { get; set; }

      public Room(string name, int type)
      {
          Name = name;
          Type = type;
      }
  }

次に、部屋のセットを指定すると、単純なlinq式を使用して特定のタイプの部屋を見つけることができます。

var match = rooms.Where(r => r.Type == 2).Select(r => r.Name).ToList();

次に、一致する部屋名のセットの中からランダムなエントリを見つけることができます(以下を参照)

ただし、並列配列を使い続けたい場合、1つの方法は、型配列から一致するインデックス値を見つけ、次に一致する名前を見つけ、次にランダム関数を使用して一致する値の1つを見つけることです。

var matchingTypeIndexes = new List<int>();
int matchingTypeIndex = -1;
do
{
  matchingTypeIndex = Array.IndexOf(roomType, 2, matchingTypeIndex + 1);
  if (matchingTypeIndex > -1)
  {
    matchingTypeIndexes.Add(matchingTypeIndex);
  }
} while (matchingTypeIndex > -1);

List<string> matchingRoomNames = matchingTypeIndexes.Select(typeIndex => roomName[typeIndex]).ToList();

次に、(上記で生成されたリストの1つから)一致するもののランダムなエントリを検索します。

var posn = new Random().Next(matchingRoomNames.Count);
Console.WriteLine(matchingRoomNames[posn]);
于 2012-04-06T09:16:11.360 に答える