Mảng có độ dài không xác định trong C #


81

Tôi vừa mới bắt đầu học C # và trong phần giới thiệu về mảng, họ đã chỉ ra cách thiết lập một biến dưới dạng một mảng nhưng có vẻ như người ta phải chỉ định độ dài của mảng khi gán, vì vậy điều gì sẽ xảy ra nếu tôi không biết độ dài của mảng?

Câu trả lời:


115

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 Listlớp.

Ví dụ:

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

3
List<int[]> myInts = new List<int[]>();có thể làm việc.
Nicolas Tyler

1
Nếu mảng Phải được gán độ 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 dòng mã đó và di chuyển khai báo biến sang dòng khác.
matthew_360

@ matthew_360 Bên trong hàm tách, mảng thực sự đang được gọi với kích thước cố định. Ví dụ: referencesource.microsoft.com/#mscorlib/system/...
Hutch

Về phản hồi của bạn "Arrays must be assigned a length"- trong một staticphương thức bên ngoài Main(), tôi đã thực hiện khai báo String[] tokens = nullvà không khởi tạo nó nhưng làm sao tôi có thể gọi "Hello.World".Split('.')nó mà không gặp System.NullReferenceExceptionlỗi?
Minh Tran

40

Sử dụng List<>để tạo 'mảng' có độ 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à a List.

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

Đối với tôi, Danh sách đã giải quyết được 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,

2
sử dụng System.Collections.Generic;
PodTech.io

20

Một chút thông tin cơ bản:

Như đã nói, nếu bạn muốn có một bộ sưu tập động, hãy sử dụng a List<T>. Bên trong, một 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 a List, nó sẽ được thêm vào mảng. Ban đầu, phần Listbắt đầu với một mảng mà tôi tin rằng có độ dài là 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 phân bổ, (tôi nghĩ) có kích thước gấp đôi kích thước của mảng cũ. , như 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, mặc dù a Listcó thể tỏ ra năng động đối với người quan sát bên ngoài, nhưng bên trong 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 miễn phí vì vậy người ta nên nhắm đến việc có càng ít những mảng đó càng tốt và để làm điều đó bạn có thể chỉ định (trong hàm tạo của List) kích thước ban đầu của mảng, mà trong một kịch bản hoàn hảo là vừa đủ 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 bao giờ quan trọng đối với bạn, nhưng thật tuyệt khi biết bạn thực sự đang làm gì.


1
Đây chính xác là thông tin tôi đã theo đuổi. Đúng và nhiều thông tin hơn hầu hết các câu trả lời khác. +1
Carrie Kendall

16

Bạn có thể tạo một mảng với kích thước được đặt thành 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 đó 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ực 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. Cố gắng List.


Tất cả đều rỗng. Hãy thử string[] words = new string(',', size - 1).Split(',');ngay bây giờ chúng được khởi tạo bằng "".
Bitterblue

3

Sử dụng ArrayListif trong .NET 1.x hoặc List<yourtype>if trong .NET 2.0 hoặc 3.x.

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


2

Bạn cũng có thể muốn xem xét Từ điển 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.

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ụ tích hợp sẵn để tìm kiếm và cập nhật giá trị.


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!");


1

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

Đó là điều bắt buộc đối với bất kỳ nhà phát triển C # nào, rất đáng để dành thời gian tìm hiểu :)


1

Như đã nêu chi tiết ở trên, Danh sách chung chung <> là cách tốt nhất để làm điều đó.

Nếu bạn bị mắc 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 truyền - lộn xộn.

Các phiên bản kế tiếp cũng đã triển khai các biến thể khác nhau - bao gồm cả các biến thể an toàn chuỗi.


1

Nếu bạn thực sự cần sử dụng một mảng thay vì một danh sách, thì bạn có thể tạo một mảng có kích thước được tính tại thời điểm chạy như vậy ...

Ví dụ: tôi muốn một mảng hai chiều có kích thước n x n. n sẽ được nhận vào lúc chạy từ người dùng

int n = 0;
bool isInteger = int.TryPase(Console.ReadLine(), out n);
var x = new int[n,n];

tương tự đối với mảng một chiều, tôi sẽ viết: var x = new int [n];
Ken Janka
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.