簡體   English   中英

在C#中使用set-length數組

[英]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個實體之間的任何地方時,我不確定如何在游戲環境中接近它。

  1. 我是否只是將數組長度設置得足夠長,以滿足我所擁有的所有實際數量的實體?
  2. 是否有不同的方式我應該存儲我應該在C#中使用的實體,我不知道?
  3. 我是否編寫了自己的類,用新的長度重新聲明數組,並將舊數組中的對象復制到新數組中,剩下1個空閑插槽?

任何的意見都將會有幫助!

你發現,陣列在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;

http://www.dotnetperls.com/arraylist

暫無
暫無

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

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