Mảng động trong C #


112

Có phương pháp nào để tạo mảng động trong C # không?


1
Nếu bạn vẫn còn mắc kẹt trong lớp bùn cũ, bằng cách sử dụng [] thay vì List <>, bạn có thể sử dụng Array.Resize (). Đây là một ví dụ tốt. dotnetperls.com/array-resize
Gian

Liên kết dotnetperls.com/array-resize không hoạt động. (FYI)
Su Llewellyn

Câu trả lời:


150

Hãy xem Danh sách Chung .


13
Câu hỏi (mặc dù ngắn và không mô tả) không hỏi về danh sách chung - Câu hỏi có thể hỏi về dynamic[] msdn.microsoft.com/en-GB/library/dd264736.aspx (mảng các loại động) hoặc ExpandoObject msdn.microsoft.com/ en-us / thư viện / ... tôi có thể -1 câu trả lời cho không nhắc đến những
Luke T O'Brien

6
@ LukeTO'Brien, động lực học đã được giới thiệu trong C # 4.0, được phát hành một năm sau khi câu hỏi này ban đầu được hỏi. OP có lẽ đã được hỏi về một cấu trúc dữ liệu resizeable như en.wikipedia.org/wiki/Dynamic_array
Brian Merrell

6
Các câu trả lời chỉ bao gồm các liên kết đến các bài báo là vô ích. Không có gì đảm bảo liên kết sẽ vẫn hoạt động.
JamEngulfer

@JamEngulfer Điều đó không đúng sự thật. Nếu văn bản liên kết của anh ấy là "Nhìn vào cái này" với "cái này" được liên kết, tôi đồng ý với bạn. Nếu bạn xóa liên kết và xem những gì còn lại, câu trả lời của OP cho "hãy xem danh sách chung" là rất nhiều thông tin để có được bất kỳ người đọc nào trong tương lai tìm kiếm trên Google ....
Lynn Crumble

88

Mở rộng câu trả lời của Chris và Migol với một mẫu mã.

Sử dụng một mảng

Student[] array = new Student[2];
array[0] = new Student("bob");
array[1] = new Student("joe");

Sử dụng một danh sách chung. Về cơ bản, lớp List <T> sử dụng một mảng để lưu trữ nhưng làm như vậy theo cách cho phép nó phát triển hiệu quả.

List<Student> list = new List<Student>();
list.Add(new Student("bob"));
list.Add(new Student("joe"));
Student joe = list[1];

2
ví dụ này hơi tệ, vì cả hai chúng ta đều đã nói về ArrayList
Migol 27/02/09

21
Câu trả lời này tốt hơn @Migol của bạn, vì câu trả lời này cho thấy cách thực sự sử dụng Danh sách <> thay vì chỉ đề cập đến nó như một từ khóa. "half-bad" -> "half-good" -> tốt
fhugas

56

Đôi khi mảng đơn giản được ưu tiên hơn Danh sách chung, vì chúng thuận tiện hơn (Ví dụ: Hiệu suất tốt hơn cho việc tính toán tốn kém - Ứng dụng Đại số Số hoặc để trao đổi Dữ liệu với phần mềm Thống kê như R hoặc Matlab)

Trong trường hợp này, bạn có thể sử dụng phương thức ToArray () sau khi khởi tạo động Danh sách của bạn

List<string> list = new List<string>();
list.Add("one");
list.Add("two");
list.Add("three");

string[] array = list.ToArray();

Tất nhiên, điều này chỉ có ý nghĩa nếu kích thước của mảng không bao giờ được biết cũng như không cố định ex-ante . Nếu bạn đã biết kích thước mảng của mình tại một thời điểm nào đó của chương trình , tốt hơn nên bắt đầu nó như một mảng có độ dài cố định. (Ví dụ: nếu bạn truy xuất dữ liệu từ Tập kết quả, bạn có thể đếm kích thước của nó và khởi tạo một mảng có kích thước đó, theo cách động)


1
Không đáng, miễn là bạn còn sử dụng trình chỉ mục.
aaimnr

2
Ararys không thuận tiện hơn (chúng cung cấp tập hợp con của giao diện List <T>) và cung cấp hiệu suất gần như giống nhau, vì List <T> sử dụng mảng thông thường bên dưới. Lặp lại cho 6000000 phần tử: Danh sách / cho: 1971ms Mảng / cho: 1864ms (Điểm chuẩn từ stackoverflow.com/questions/454916/… )
aaimnr

9
Nếu bạn phải truyền một mảng cho một giao diện thì nó phải là một mảng. Việc xây dựng một danh sách và sau đó biến nó thành một mảng dễ dàng hơn nhiều ngay trước khi bạn chuyển nó. Tôi thích câu trả lời này hơn những câu khác vì nó giải quyết được câu hỏi!
Michael Stimson

36

List<T>để gõ mạnh một hoặc ArrayListnếu bạn có .NET 1.1 hoặc thích ép kiểu các biến.


2

Ví dụ về mảng động:

Console.WriteLine("Define Array Size? ");
int number = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Enter numbers:\n");
int[] arr = new int[number];

for (int i = 0; i < number; i++)
{
    arr[i] = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i < arr.Length; i++ )
{
    Console.WriteLine("Array Index: "+i + " AND Array Item: " + arr[i].ToString());
}
Console.ReadKey();

2

Bạn có thể làm điều này với các đối tượng động:

var dynamicKeyValueArray = new[] { new {Key = "K1", Value = 10}, new {Key = "K2", Value = 5} };

foreach(var keyvalue in dynamicKeyValueArray)
{
    Console.Log(keyvalue.Key);
    Console.Log(keyvalue.Value);
}

1

Sử dụng danh sách mảng thực sự là hiện thực mảng. Ban đầu nó có kích thước mảng 4 và khi nó đầy, một mảng mới được tạo với kích thước gấp đôi của nó và dữ liệu của mảng đầu tiên được sao chép vào mảng thứ hai, bây giờ mục mới được chèn vào mảng mới. Ngoài ra, tên của mảng thứ hai tạo ra một bí danh của mảng thứ nhất để nó có thể được truy cập bằng tên giống như trước đó và mảng đầu tiên được xử lý


1

bạn có thể sử dụng đối tượng danh sách mảng từ lớp tập hợp

using system.collections;
   static void main()
        {
        Arrylist arr=new Arrylist();
         }

khi bạn muốn thêm phần tử bạn có thể sử dụng

arr.add();

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.