簡體   English   中英

C#在列表上的執行時間過長 <T> 。找()

[英]C# exceedingly long execution time on List<T>.Find()

我正在使用C#構建包含基於網格的地圖系統的游戲。 我將網格系統存儲在List對象中,其中T是包含位置和其他數據的類型。 在調用找到圖塊鄰居的函數時,我遇到了執行的極大延遲。 我將延遲范圍縮小到對List的Find()方法的調用。 該方法如下所示:

list.Find(tile => tile.X == x && tile.Y == y)

為什么這會造成如此巨大的滯后? 除了將磁貼存儲在列表中,還有其他更好的選擇嗎?

Find是O(n),其中n是列表的Count。 如果您始終按坐標對進行查找,則由於可以在鍵上進行O(1)查找,因此Dictionary確實可以提供幫助。 您可以從Dictionary<Tuple<int,int>, Tile> ,看看是否滿足您的需求。 顯然,從長遠來看,Dictionary是否更好取決於列表的大小和您需要執行的查找類型。

如果您的地圖是正方形/矩形且具有固定大小(或可變大小,但不經常更改),則使用二維數組並按索引訪問圖塊可能會獲得更好的性能。

您無需指出xy值是圖塊索引還是與圖塊中包含的坐標有關。 無論哪種方式,您都可以為每個圖塊計算一個索引,這樣對於n圖塊,索引從0..n-1運行,可用於索引數組。

您可以將地圖數組定義為:

Tiles[,] map = new Tiles[numXTiles, numYTiles];

然后訪問磁貼很簡單:

var tile = map[x, y];

有跡象表明,多維數組的性能要比鋸齒數組低,但多維數組更易於創建,並且(在我看來)語法更好。 如果仍然存在問題,則可以使用鋸齒狀數組,也可以使用一維數組,然后將索引計算為: x + y * numXTiles

如果像您這樣經常進行相同類型的查詢,則在組合鍵上使用索引器來檢索對象是有意義的,因為索引器通常具有或多或少的恆定性能。 意味着如果對象數量增加,找到對象的時間不會增加。

為此,請使用字典,其中TKey是例如字符串,每個鍵是tile.X +“ ” +tile.Y。 要檢索該對象,只需調用dic [tile.X +“ ” + tile.Y]

由於在該lambda表達式中表示您知道x和y坐標,因此如建議的那樣,最好使用2D數組。 LINQ很棒,但是不應該在任何地方使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM