2013-08-20 32 views
2

的設置創建在C#

多層矩陣上下的收藏我有一個List<Room>(),我得到一個服務了。該列表每10秒刷新一次,並且房間被添加並移除。

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

我的工作

要在屏幕上顯示這些房間,我有可變大小的矩陣狀觀。 有時矩陣是3 x 3單元格,其他時間是4 x 2或5 x 1.

我需要一種方法來「記住」哪個槽/單元格被放置在一個房間中,所以我認爲DataTable會給我這個選擇。

要存儲我用數據表,它有3列的單元:

  • 「列」(INT)
  • 「行」(INT)
  • 「室」(房間)

所以,如果我有一個2 x 4矩陣,它看起來像這樣。

 

Column | Row | Room 
----------------------------- 
    0 | 0 | rooms[0] 
----------------------------- 
    1 | 0 | rooms[1] 
----------------------------- 
    2 | 0 | rooms[2] 
----------------------------- 
    0 | 1 | rooms[3] 
----------------------------- 
    1 | 2 | rooms[4] 

And so forth... 

一旦我有了這個DataTable,我就可以刷新屏幕,知道每個房間都會顯示在之前的位置。這可能可以通過更智能的方式實現。

問題

現在我需要枚舉List<Room>,並填補了矩陣/數據表。

如果我有更多的房間比單元格,那麼我需要再次開始位置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查詢不能修復!」。然後我磚...

什麼是最有效/最好的方法來填補這個矩陣?

+1

但**在我的大腦**:* LINQ不能總是做的事情,特別是有關設置/更改沒有得到/查詢* –

+2

你不應該使用'DataTable'來表示矩陣。首先,這是一個相當「重」的對象,而不是輕量級的對象。接下來,它被設計爲表示一系列行,這與nxm矩陣並不完全相同。這樣做的一個主要結果就是你不設置單獨的單元格,而是設置行。只用一個多維矩陣你可能會更好。 – Servy

回答

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

然後你可以使用位置,左側的接合部它矩陣顯示的目的,或發現第一個空位置。