Kích thước mảng (Chiều dài) trong C #


97

Làm cách nào để xác định kích thước của một mảng (độ dài / số lượng mục) trong C #?


1
@Marcelo: ... nhưng nó vẫn không thể trả lời những câu hỏi thực sự đơn giản như "Kính của tôi đâu". ;)
Guffa

2
Bạn có nghĩa là gì với "kích thước"? Số lượng phần tử hoặc kích thước tính bằng byte?
Fredrik Mörk

2
@fearofawhackplanet Tôi ủng hộ vì tôi gặp vấn đề tương tự khi tìm Độ dài không hoạt động cho mảng nhiều chiều và do câu hỏi này phát hiện ra Xếp hạng và GetLength (chỉ mục).
TheMathemagician,

1
@fearofawhackplanet Tôi tin rằng thực tế là nó có 145.000 lượt xem là một minh chứng cho sự liên quan của nó. Đã ủng hộ.
brycejl

Câu trả lời:


152

Nếu đó là mảng một chiều a,

a.Length

sẽ cho số phần tử của a.

Nếu blà một mảng đa chiều hình chữ nhật (ví dụ int[,] b = new int[3, 5];:)

b.Rank

sẽ cho số thứ nguyên (2) và

b.GetLength(dimensionIndex)

sẽ nhận được độ dài của bất kỳ thứ nguyên nhất định nào (lập chỉ mục dựa trên 0 cho các thứ nguyên - b.GetLength(0)3 và b.GetLength(1)5 cũng vậy).

Xem tài liệu System.Array để biết thêm thông tin.

Như @Lucero đã chỉ ra trong các nhận xét, có một khái niệm về "mảng răng cưa", thực sự không hơn gì một mảng đơn chiều gồm các mảng (thường là một chiều).

Ví dụ, một trong những có thể có như sau:

int[][] c = new int[3][];
c[0] = new int[] {1, 2, 3};
c[1] = new int[] {3, 14};
c[2] = new int[] {1, 1, 2, 3, 5, 8, 13};

Lưu ý rằng 3 thành viên của ctất cả đều có độ dài khác nhau. Trong trường hợp này, như trước đây c.Lengthsẽ chỉ ra số phần tử của c, (3) và c[0].Length, c[1].Lengthc[2].Lengthsẽ là 3, 2 và 7, tương ứng.


1
Để đầy đủ, bạn cũng có thể liệt kê cách hoạt động của các mảng răng cưa (ví dụ int[][]:) ;-)
Lucero

Tôi đã xem xét nó, @Lucerno, nhưng nó lại là một vấn đề khác - tìm ra kích thước của những thứ bên trong một mảng - một mảng răng cưa thực sự chỉ là một mảng có kích thước duy nhất chứa các mảng có kích thước đơn, như tôi chắc bạn biết .
Blair Conrad

3
tất nhiên tôi biết rằng bạn đúng và đó là lý do tại sao tôi thêm nhận xét với một mặt cười thay vì tự viết câu trả lời. Tuy nhiên, sự phân biệt giữa [,][][]dường như không rõ ràng đối với tất cả người mới .NET, vì vậy có thể vẫn cần lưu ý rằng đó [][]không phải là một mảng đa chiều theo nghĩa của câu trả lời của bạn.
Lucero

2
Câu trả lời tốt. Tuy nhiên, bạn có thể muốn thay đổi b.GetLength[0] is 3 and b.GetLength[1] is 5nên b.GetLength(0) and b.GetLength(1).
Droogans

29

Bạn có thể xem tài liệu về Array để tìm ra câu trả lời cho câu hỏi này.

Trong trường hợp cụ thể này, bạn có thể cần Chiều dài :

int sizeOfArray = array.Length;

Nhưng vì đây là một câu hỏi cơ bản và bạn chắc chắn có nhiều câu hỏi tương tự như thế này, thay vì chỉ cho bạn biết câu trả lời, tôi muốn cho bạn biết cách tự tìm câu trả lời.

Visual Studio Intellisense

Khi bạn nhập tên của một biến và nhấn .phím, nó sẽ hiển thị cho bạn danh sách tất cả các phương thức, thuộc tính, sự kiện, v.v. có sẵn trên đối tượng đó. Khi bạn đánh dấu một thành viên, nó sẽ cung cấp cho bạn một mô tả ngắn gọn về chức năng của nó.

Nhấn F1

Nếu bạn tìm thấy một phương pháp hoặc thuộc tính có thể thực hiện những gì bạn muốn nhưng bạn không chắc chắn, bạn có thể di chuyển con trỏ qua nó và nhấn F1 để nhận trợ giúp. Tại đây, bạn sẽ nhận được mô tả chi tiết hơn nhiều cùng với các liên kết đến thông tin liên quan.

Tìm kiếm

Các cụm từ tìm kiếm size of array in C#cung cấp nhiều liên kết cho bạn biết câu trả lời cho câu hỏi của bạn và hơn thế nữa. Một trong những kỹ năng quan trọng nhất mà một lập trình viên phải học là cách tìm kiếm thông tin. Việc tự tìm câu trả lời thường nhanh hơn, đặc biệt nếu câu hỏi tương tự đã được hỏi trước đó.

Sử dụng một hướng dẫn

Nếu bạn mới bắt đầu học C #, bạn sẽ thấy dễ dàng hơn khi làm theo hướng dẫn. Tôi có thể giới thiệu các hướng dẫn C # trên MSDN. Nếu bạn muốn một cuốn sách, tôi muốn giới thiệu Essential C # .

Tràn ngăn xếp

Nếu bạn không thể tự mình tìm thấy câu trả lời, vui lòng đăng câu hỏi trên Stack Overflow. Nhưng chúng tôi đánh giá cao điều đó nếu bạn cho thấy rằng bạn đã nỗ lực để tự tìm câu trả lời trước.


3
Làm tốt lắm, Mark, nhưng có thể là quá mức cần thiết!
Nayan

1
@Nayan: Cảm ơn! Mặc dù thật tuyệt khi OP nhận được câu trả lời của mình nhanh chóng từ các áp phích khác, tôi cảm thấy điều quan trọng hơn là dạy những người mới bắt đầu cách tìm kiếm thông tin hơn là dạy họ câu trả lời cho các câu hỏi cụ thể. Tôi hy vọng OP thấy câu trả lời này hữu ích và nó giúp họ không phải đặt ra hàng trăm câu hỏi mà lẽ ra họ có thể tự tìm ra câu trả lời.
Mark Byers

12
+1 vì đã dành thời gian để thực hiện phương pháp này - "cho một người đàn ông một con cá ...", v.v.
Peter Kelly

Nếu tôi phải làm như vậy, tôi sẽ chỉ chuyển hướng các OP đến câu trả lời của bạn ở đây =) Và vâng, tôi hoàn toàn đồng ý với bạn!
Nayan

1
Điều này là tốt nhưng tôi cảm thấy nó nên được liên kết tự động bằng cách nào đó. Họ không thể bắt đầu một trang "câu trả lời đáng xem"? Một điều mà tôi muốn bổ sung là người ta nên tự kiểm tra lỗi tràn ngăn xếp trước khi đăng câu hỏi. Thường thì tôi chỉ bắt đầu đăng câu hỏi và sau đó thấy các câu hỏi liên quan bật lên. Tôi không chắc liệu câu trả lời có tồn tại ở nơi khác trên internet hay không nếu nó cũng không thuộc ở đây.
user420667

16

cho mảng 1 chiều

int[] listItems = new int[] {2,4,8};
int length = listItems.Length;

cho mảng đa chiều

int length = listItems.Rank;

Để có được kích thước của 1 chiều

int length =  listItems.GetLength(0);

2
Các Rankbất động sản không trả lại số mục, nó sẽ trả về số lượng kích thước.
Guffa

Tôi có thể tìm tài liệu về các thuộc tính được hỗ trợ bởi mảng 1 chiều ở đâu? (ví dụ Length, Rank, GetLength)
Minh Trần


8

Với Lengthtài sản.

int[] foo = new int[10];
int n = foo.Length; // n == 10

5

Đối với mảng một thứ nguyên, bạn sử dụng thuộc Lengthtính:

int size = theArray.Length;

Đối với mảng nhiều thứ nguyên, thuộc Lengthtính trả về tổng số mục trong mảng. Bạn có thể sử dụng GetLengthphương pháp để lấy kích thước của một trong các thứ nguyên:

int size0 = theArray.GetLength(0);

3

Trong hầu hết các trường hợp chung, 'Độ dài' và 'Đếm' được sử dụng.

Mảng:

int[] myArray = new int[size];
int noOfElements = myArray.Length;

Mảng danh sách đã nhập:

List <int> myArray = new List<int>();
int noOfElements = myArray.Count;

1

nó sẽ như thế này: 1D:

 type[] name=new type[size]  //or =new type[]{.....elements...}

2D:

 type[][]name=new type[size][] //second brackets are emtpy

sau đó khi bạn sử dụng mảng này:

 name[i]=new type[size_of_sec.Dim]

hoặc Bạn có thể khai báo một cái gì đó giống như một ma trận

type[ , ] name=new type [size1,size2]

0

Những gì đã bỏ lỡ cho đến nay là những gì tôi đột nhiên cảm thấy khó chịu:

Làm cách nào để biết số lượng mục bên trong mảng? Bằng .Lengthnhau.Count của một danh sách?

Câu trả lời là: số lượng vật phẩm kiểu X được đưa vào một mảng kiểu X được tạo ra new X[number] mà bạn phải tự gánh lấy !

Ví dụ. sử dụng bộ đếm: int countItemsInArray = 0countItemsInArray++cho mọi lần gán cho mảng của bạn.

(Mảng vừa tạo với new X[number]có tất cả không gian cho numbercác mục (tham chiếu) kiểu X đã được cấp phát, bạn có thể gán cho bất kỳ vị trí nào bên trong làm nhiệm vụ đầu tiên của mình, chẳng hạn (nếu number= 100 và tên biến = a) a[50] = new X();.

Tôi không biết liệu C # có chỉ định giá trị ban đầu của từng vị trí bên trong một mảng khi tạo hay không, nếu nó không hoặc giá trị ban đầu bạn không thể so sánh với (vì nó có thể là giá trị mà chính bạn đã đặt vào mảng), bạn sẽ phải theo dõi những vị trí nào bên trong mảng mà bạn đã chỉ định nếu bạn không chỉ định tuần tự bắt đầu từ đó 0(trong trường hợp đó, tất cả các vị trí nhỏ hơncountItemsInArray sẽ được gán cho).)

Trong câu hỏi của bạn, kích thước của một mảng (độ dài / số lượng mục) tùy thuộc vào việc / có nghĩa là viết tắt của "thay thế" hay "chia cho", cái sau vẫn phải được bao phủ ("số lượng mục" mà tôi vừa đưa ra là " số lượng mặt hàng "và những thứ khác đã cung cấp .Lengthtương ứng với giá trị numbertrong mã của tôi ở trên):

C # có một sizeoftoán tử ( https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/sizeof ). Nó an toàn để sử dụng cho các kiểu cài sẵn (chẳng hạn như int) (và chỉ hoạt động trên các kiểu (không phải biến)). Do đó, kích thước của một mảng bkiểu tính intbằng byte sẽ là b.Length * sizeof(int).

(Do tất cả không gian của một mảng đã được phân bổ khi tạo, như đã đề cập ở trên và sizeofchỉ hoạt động trên các loại, không có mã nào giống như sizeof(variable)/sizeof(type)sẽ hoạt động hoặc mang lại số lượng mục mà không cần theo dõi.)

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.