[英]Working with set-length arrays in C#
我是C#的新手,但在ActionScript 3中有很強的背景知識。
在AS3中,您可以像這樣定義一個數組:
var array:Array = [];
然后通過push()
向該數組添加無限項:
array.push(1);
我在C#中注意到你需要為數組定義一個永久(我認為)的長度,例如:
string[] array = {"this","has","a","length","of","six"};
要么:
string[] array = new string[6];
如果我嘗試向數組添加新項目將超出此數組的長度,我將收到一個錯誤:
array[6] = "failure";
我發現很難從能夠自由地添加/刪除數組中的項目,到現在必須定義最大長度。
當一個數組可以包含0到10000個實體之間的任何地方時,我不確定如何在游戲環境中接近它。
任何的意見都將會有幫助!
你發現,陣列在C#中是固定大小的; 調整數組大小會引用指定大小的新數組實例,並將數組中的項復制到新引用的實例中。
您在.NET中尋找的是通用集合,例如List<T>
,其中T
是某種類型的泛型類型參數。 在您突出顯示的特定情況下,您可能希望使用List<string>
var strings = new List<string>();
現在您可以使用Add()
向集合中添加字符串
strings.Add("string to add");
在C#3中,引入了集合初始化器 ,以便您可以更簡潔地初始化集合
var strings = new List<string> { "string1", "string2", "string3" };
創建泛型集合的實例時,它以默認大小開始; .NET 4中List<T>
的默認大小為0,但是當添加第一個項目時,默認大小增加到4(默認大小可能因不同的集合類型和框架版本而異,所以聽起來默認大小是實現細節)。 集合通常使用雙倍策略通過框架調整大小,也就是說,當集合達到容量而另一個項目正在嘗試添加時,集合容量通常會加倍 - 這在通用集合的實現中得到了解決。你不需要關心的事情。
如果您想要記住它,那么當您向集合添加已知數量的項目或知道要添加的項目數量級時。 在這種情況下,您可以考慮使用List<T>
的重載構造函數,該構造函數將int
作為默認大小
var strings = new List<string>(500);
根據您的具體要求,您可能會使用List<T>
。
var list = new List<string> { "this", "has", "a", "length", "of", "six" };
list.Add("success");
list[5] = "seven";
Console.WriteLine(list.Count); // 7
看看System.Collections.Generic
中的List<T>
。 這只是一個包含T類對象的動態數組。您可以按索引添加內容和訪問項。
using System.Collections.Generic;
// ...
List<int> L = new List<int>();
L.Add(1);
L.Add(99);
Console.WriteLine(L.Count); // prints 2
Console.WriteLine(L[0]); // prints 1
Dictionary
是JavaScript / ActionScript關聯數組中最直接的類比 - 允許sparce索引,但沒有有意義的迭代0,1,.... n。 SortedDictionary也可以是一個選項。
如果你只需要增長的普通數組並包含所有條目 - List<T>
。
掃描System.Collections.Generic中的所有類和接口。 List<T>
和Dictionary<TKey, TValue>
值得特別近距離觀看,但其余的你可以在了解更多信息時更詳細地回過頭來看看。 你會發現你經常使用列表和詞典。 固定長度數組仍然有它們的位置,但是如果你開始使用像Actionscript這樣的ECMA-Script變體,可能需要一段時間才能看到它們的限制帶來的功能。 希望你不會過分反對並狂熱地使用它們,因為在某些情況下它們可以快幾納秒;)
在第一次閱讀時忽略“擴展方法”部分。 那些東西真的非常有用,所以稍后再研究它,但你不想被信息所淹沒而不記得任何信息。
從.NET2.0開始,System.Collections的使用率低於1.1,因為在很多情況下我們必須使用它們,System.Collections.Generic中的那些更合適。 System.Collections中的其他命名空間也充滿了好東西,但是一旦你理解了列表和字典(以及System.Collections.Concurrent,一些多線程概念),它就更容易理解它們的重點。
您應該在System.Collections.Generic命名空間中使用List< someType >
而不是set-size數組。 此集合將以您習慣的方式運行 - 允許您在運行時動態添加/刪除項目,而不是將您綁定到設置的大小。 你可以Add(), Insert(),AddAt(), Remove(), RemoveAt()
和許多其他方法。 好的是,它也適用於Linq功能。
myList.Where( itm=>itm.PlayerName == "Steve" ) // for example
這里是List<T>
的MSDN文檔 ,有一個很好的綜合列表,列出了頁面底部的Linq操作。
您可以在using System.Collections;
使用ArrayList<T>
using System.Collections;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.