2

セットアップ

サービスから返されるがList<Room>()あります。リストは 10 秒ごとに更新され、部屋が追加および削除されます。

class Room 
{
    public int ID {get;set;}
}

私の仕事

これらの部屋を画面に表示するために、可変サイズのマトリックスのようなビューを用意しました。マトリックスが 3 x 3 セルの場合もあれば、4 x 2 または 5 x 1 の場合もあります。

部屋が配置されたスロット/セルを「覚える」方法が必要だったので、DataTable がそのオプションを提供してくれると思いました。

セルを格納するには、3 つの列を持つ DataTable を使用します。

  • "列" (int)
  • "行" (int)
  • 「部屋」(ルーム)

したがって、2 x 4 のマトリックスがある場合、次のようになります。

 コラム | 行 | 行 | 部屋
------------------------------
    0 | 0 | 部屋[0]
------------------------------
    1 | 0 | 部屋[1]
------------------------------
    2 | 0 | 部屋[2]
------------------------------
    0 | 1 | 部屋[3]
------------------------------
    1 | 2 | 部屋[4]

などなど…

この DataTable を取得したら、画面を更新して、各部屋が以前の位置に表示されることを確認できます。これはおそらく、よりスマートな方法で実現できます。

問題

List<Room>ここで、matrix/DataTableを列挙して入力する必要があります。

セルよりも多くの部屋がある場合は0,0、すべての部屋にセルが割り当てられるまで、(新しいマトリックスをレイヤーとして追加するなど) 位置からやり直す必要があります。

これまでのアプローチ

for(...)次のようなループをいくつか試しました。

int totalTiles = area.TileColumns * area.TileRows;
int totalLayers = (int)Math.Ceiling((double)area.Rooms.Count / totalTiles);

for (int i = 0; i < totalLayers; i++)
{
    for (int j = 0; j < area.TileRows; j++)
    {
        for (int k = 0; k < area.TileColumns; k++)
        {
            // This is going nowhere :-(
        }
    }
}

私の脳内

この問題に最初に遭遇したとき、私はすぐに「単純な LINQ クエリで解決できないことは何もない!」と思いました。. そして、私はレンガを作りました...

このマトリックスを満たすための最も効率的/最高のパフォーマンスのアプローチは何ですか?

4

1 に答える 1

1

実行時に行/列が変更されるなど、仮定を立てることができずに、完全に動的にするだけでよいと言わざるを得ません。

class RoomStorage
{
    public Room room {get;set;}
    public int layer {get;set;}
    public int row {get;set;}
    public int col {get;set;}
}

var matrix=new List<RoomStorage>();

次に、次のようなことができます。

var newRooms=new List<Room>(); // Get from service

//Remove rooms no longer in use
var matrix=matrix.Where(m=>newRooms.Select(nr=>nr.ID).Contains(m.Room.ID));

//Find rooms we need to add (Optionally use Exclude for faster perf)
var roomsToAdd=newRooms.Where(r=>matrix.Select(m=>m.Room.ID).Contains(r.ID));

var maxLayer=matrix.Max(m=>m.layer);
var rows = ?
var cols = ?

var positions=Enumerable
    .Range(0,maxLayer+1)
    .SelectMany(layer=>
        Enumerable
        .Range(0,rows)
        .SelectMany(row=>
            Enumerable
                .Range(0,cols)
                .Select(col=>new {layer,row,col})));

次に、位置を使用して、表示目的でマトリックスに結合したり、最初の空の位置を見つけたりすることができます。

于 2013-08-22T16:28:17.050 に答える