2009-03-01 43 views
65

Tôi vừa mới bắt đầu học C# và trong phần giới thiệu về mảng chúng cho thấy cách thiết lập biến như một mảng nhưng có vẻ như phải chỉ định độ dài của mảng khi gán, nếu tôi không biết chiều dài của mảng?Mảng có chiều dài không xác định trong C#

Trả lời

96

Mảng phải được gán độ dài. Để cho phép bất kỳ số phần tử nào, hãy sử dụng lớp List.

Ví dụ:

List<int> myInts = new List<int>(); 
myInts.Add(5); 
myInts.Add(10); 
myInts.Add(11); 
myInts.Count // = 3 
+2

Điều gì xảy ra nếu hai chiều? –

+1

'Danh sách myInts = Danh sách mới ();' có thể hoạt động. –

+0

Nếu mảng phải được gán một độ dài, thì tại sao tôi có thể làm điều này: String [] arr = "test; the; values; now" .Split (';'); và nó chỉ xác định chiều dài? Tuy nhiên, tôi không thể lấy cùng một dòng mã đó và di chuyển biến khai báo sang một dòng khác. –

1
var yummy = new List<string>(); 
while(person.FeelsHappy()) { 
    yummy.Add(person.GetNewFavoriteFood()); 
} 
Console.WriteLine("Sweet! I have a list of size {0}.", list.Count); 
Console.WriteLine("I didn't even need to know how big to make it " + 
    "until I finished making it!"); 
12

Bạn có thể tạo một mảng với kích thước thiết lập để một biến, tức là

int size = 50; 
string[] words = new string[size]; // contains 50 strings 

Tuy nhiên, kích thước mà không thể thay đổi sau này, nếu bạn quyết định bạn cần 100 từ. Nếu bạn cần kích thước thật sự năng động, bạn sẽ cần sử dụng một loại cấu trúc dữ liệu khác. Hãy thử List.

+0

Đây là tất cả null. Hãy thử 'string [] words = new string (',', size - 1) .Split (',');' Bây giờ chúng được khởi tạo với '" "'. – Bitterblue

2

Sử dụng ArrayList nếu trong .NET 1.x hoặc List<yourtype> nếu trong .NET 2.0 hoặc 3.x.

Tìm kiếm chúng trong System.CollectionsSystem.Collections.Generics.

29

Sử dụng List<> để tạo một 'mảng' có chiều dài không xác định.

Sử dụng List<>.ToArray() để trả về một mảng thực và không phải là List.

var list = new List<int>(); 
list.Add(1); 
list.Add(2); 
list.Add(3); 
var array = list.ToArray(); 
+0

Đối với tôi, Danh sách đã giải quyết vấn đề về kích thước không xác định và sau đó .ToArray() đã tạo mảng mà tôi cần. – dev1998

+1

bằng System.Collections.Generic; – Hariboo

1

thử một danh sách chung thay vì mảng

2

Bạn cũng có thể muốn xem xét Dictionarys nếu dữ liệu của bạn là duy nhất, Điều này sẽ cung cấp cho bạn hai cột để làm việc với.

Tên người dùng, Tổng hóa đơn

nó cung cấp cho bạn rất nhiều công cụ được tích hợp để tìm kiếm và cập nhật chỉ giá trị.

1

Tóm lại, vui lòng sử dụng Bộ sưu tập và Generics.

Đó là một bắt buộc đối với bất kỳ nhà phát triển C#, nó có giá trị dành thời gian để học hỏi :)

11

Một chút thông tin background:

Như đã nói, nếu bạn muốn có một bộ sưu tập năng động của sự vật, sử dụng một List<T> . Bên trong, Danh sách cũng sử dụng một mảng để lưu trữ. Mảng đó có kích thước cố định giống như bất kỳ mảng nào khác. Khi một mảng được khai báo là có kích thước, nó không thay đổi. Khi bạn thêm một mục vào một số List, nó sẽ được thêm vào mảng. Ban đầu, các List bắt đầu với một mảng mà tôi tin rằng có chiều dài 16. Khi bạn cố gắng thêm mục thứ 17 vào List, điều xảy ra là một mảng mới được cấp phát, đó là (tôi nghĩ) gấp đôi kích thước của cũ, vì vậy 32 mặt hàng. Sau đó, nội dung của mảng cũ được sao chép vào mảng mới. Vì vậy, trong khi List có thể xuất hiện động với người quan sát bên ngoài, nội bộ nó cũng phải tuân thủ các quy tắc.Và như bạn có thể đoán, việc sao chép và phân bổ các mảng không phải là miễn phí, vì vậy bạn nên nhắm đến số ít nhất có thể và để làm điều đó, bạn có thể chỉ định (trong hàm khởi tạo của List) một giá trị ban đầu kích thước của mảng, trong một kịch bản hoàn hảo chỉ đủ lớn để chứa mọi thứ bạn muốn. Tuy nhiên, đây là tối ưu hóa vi mô và nó không chắc nó sẽ quan trọng với bạn, nhưng nó luôn luôn là tốt đẹp để biết những gì bạn đang thực hiện .

+0

Đây chính xác là thông tin tôi đã theo dõi. Phát hiện và nhiều thông tin hơn hầu hết các câu trả lời khác. +1 –

1

Như đã nêu chi tiết ở trên, Danh sách chung <> là cách tốt nhất để thực hiện.

Nếu bạn bị kẹt trong .NET 1. *, thì bạn sẽ phải sử dụng lớp ArrayList thay thế. Điều này không có kiểm tra kiểu thời gian biên dịch và bạn cũng phải thêm phép đúc - lộn xộn.

Phiên bản kế thừa cũng đã triển khai các biến thể khác nhau - bao gồm các biến thể an toàn chủ đề.

Các vấn đề liên quan