Thêm giá trị vào mảng C #


511

Có lẽ đây là một điều thực sự đơn giản - tôi đang bắt đầu với C # và cần thêm các giá trị vào một mảng, ví dụ:

int[] terms;

for(int runs = 0; runs < 400; runs++)
{
    terms[] = runs;
}

Đối với những người đã sử dụng PHP, đây là những gì tôi đang cố gắng thực hiện trong C #:

$arr = array();
for ($i = 0; $i < 10; $i++) {
    $arr[] = $i;
}

10
Không nên 'điều khoản [] = value;' được 'điều khoản [] = chạy;'?
tymtam

Trong C #, bạn không thể thay đổi kích thước mảng một khi được tạo. Nếu bạn muốn một cái gì đó như mảng nhưng có thể thêm / xóa các phần tử, hãy sử dụng Danh sách <int> ().
Kamran Bigdely

Câu trả lời:


822

Bạn có thể làm theo cách này -

int[] terms = new int[400];
for (int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}

Ngoài ra, bạn có thể sử dụng Danh sách - lợi thế với danh sách, bạn không cần biết kích thước mảng khi khởi tạo danh sách.

List<int> termsList = new List<int>();
for (int runs = 0; runs < 400; runs++)
{
    termsList.Add(value);
}

// You can convert it back to an array if you would like to
int[] terms = termsList.ToArray();

Chỉnh sửa: a) cho các vòng lặp trong Danh sách <T> rẻ hơn một chút so với các vòng lặp foreach trên Danh sách <T>, b) Vòng lặp trên mảng rẻ hơn khoảng 2 lần so với vòng lặp trên Danh sách <T>, c) lặp lại mảng sử dụng cho rẻ hơn 5 lần so với lặp trong Danh sách <T> bằng cách sử dụng foreach (điều mà hầu hết chúng ta làm).


1
Lợi thế của việc sử dụng một danh sách trong kịch bản này là gì?
Phill Healey

9
@PhillHealey Bạn không cần phải "biết" mảng đó có thể lớn đến mức nào, trước khi bạn tạo nó. Như bạn có thể thấy, trong các ví dụ này, OP phải đặt một giá trị vào "new int [400]" - nhưng với danh sách, anh ta không phải làm như vậy.
Hejner

3
Sẽ không có bit đầu tiên không phải là bất cứ điều gì vì giá trị không được xác định ở bất cứ đâu. -_-
EasyBB

1
Tại sao bạn nói rằng ARRAY cần phải có kích thước ??? cứ làm đi new int[]{}!!!!!
T.Todua

6
@ T.Todua nếu bạn tạo một mảng trống như bạn đang đề xuất và sau đó thử truy cập vào các chỉ mục không tồn tại để đặt giá trị, bạn sẽ nhận được OutOfRangeExceptionngay khi bạn chạy mã. Mảng cần phải được khởi tạo với kích thước bạn sẽ sử dụng, chúng dành toàn bộ không gian lúc ban đầu, phù thủy làm cho chúng rất nhanh, nhưng không thể thay đổi kích thước.
KinSlayerUY

85

Nếu bạn đang viết bằng C # 3, bạn có thể thực hiện bằng một lớp lót:

int[] terms = Enumerable.Range(0, 400).ToArray();

Đoạn mã này giả định rằng bạn có một lệnh sử dụng cho System.Linq ở đầu tệp của bạn.

Mặt khác, nếu bạn đang tìm kiếm thứ gì đó có thể thay đổi kích thước động, vì nó xuất hiện là trường hợp của PHP (tôi chưa bao giờ thực sự học nó), thì bạn có thể muốn sử dụng Danh sách thay vì int [] . Đây là mã mà nó sẽ trông như thế nào:

List<int> terms = Enumerable.Range(0, 400).ToList();

Tuy nhiên, lưu ý rằng bạn không thể chỉ cần thêm phần tử thứ 401 bằng cách đặt các điều khoản [400] thành một giá trị. Thay vào đó, bạn cần gọi Add (), như thế này:

terms.Add(1337);

65

Sử dụng phương pháp của Linq Concat làm cho điều này trở nên đơn giản

int[] array = new int[] { 3, 4 };

array = array.Concat(new int[] { 2 }).ToArray();

kết quả 3,4,2


12
Phương thức này sẽ làm cho việc thêm 400 mục vào mảng tạo ra một bản sao của mảng có thêm một khoảng trắng và di chuyển tất cả các phần tử sang mảng mới, 400 trăm lần. Vì vậy, không nên thực hiện khôn ngoan.
KinSlayerUY

39

Câu trả lời về cách làm điều đó bằng cách sử dụng một mảng được cung cấp ở đây.

Tuy nhiên, C # có một thứ rất tiện dụng có tên System.Collections :)

Bộ sưu tập là những lựa chọn thay thế ưa thích để sử dụng một mảng, mặc dù nhiều trong số chúng sử dụng một mảng bên trong.

Ví dụ, C # có một bộ sưu tập có tên List có chức năng rất giống với mảng PHP.

using System.Collections.Generic;

// Create a List, and it can only contain integers.
List<int> list = new List<int>();

for (int i = 0; i < 400; i++)
{
   list.Add(i);
}

để lấy một phần tử danh sách: int a = list [i];
Behzad

10

Sử dụng Danh sách làm trung gian là cách dễ nhất, như những người khác đã mô tả, nhưng vì đầu vào của bạn là một mảng và bạn không chỉ muốn giữ dữ liệu trong Danh sách, tôi cho rằng bạn có thể lo ngại về hiệu suất.

Phương thức hiệu quả nhất có khả năng phân bổ một mảng mới và sau đó sử dụng Array.Copy hoặc Array.CopyTo. Điều này không khó nếu bạn chỉ muốn thêm một mục vào cuối danh sách:

public static T[] Add<T>(this T[] target, T item)
{
    if (target == null)
    {
        //TODO: Return null or throw ArgumentNullException;
    }
    T[] result = new T[target.Length + 1];
    target.CopyTo(result, 0);
    result[target.Length] = item;
    return result;
}

Tôi cũng có thể đăng mã cho một phương thức mở rộng Chèn lấy chỉ mục đích làm đầu vào, nếu muốn. Nó phức tạp hơn một chút và sử dụng phương thức tĩnh Array.Copy 1-2 lần.


2
Sẽ tốt hơn nhiều, hiệu suất khôn ngoan khi tạo một danh sách, điền nó và sau đó thực hiện sao chép này thành mảng, vì vậy bạn không tạo và sao chép mảng hơn 400 lần
KinSlayerUY

10

Dựa trên câu trả lời của Thracx (Tôi không có đủ điểm để trả lời):

public static T[] Add<T>(this T[] target, params T[] items)
    {
        // Validate the parameters
        if (target == null) {
            target = new T[] { };
        }
        if (items== null) {
            items = new T[] { };
        }

        // Join the arrays
        T[] result = new T[target.Length + items.Length];
        target.CopyTo(result, 0);
        items.CopyTo(result, target.Length);
        return result;
    }

Điều này cho phép thêm nhiều hơn một mục vào mảng hoặc chỉ truyền một mảng dưới dạng tham số để nối hai mảng.


8

Bạn phải phân bổ mảng trước:

int [] terms = new int[400]; // allocate an array of 400 ints
for(int runs = 0; runs < terms.Length; runs++) // Use Length property rather than the 400 magic number again
{
    terms[runs] = value;
}

5
int ArraySize = 400;

int[] terms = new int[ArraySize];


for(int runs = 0; runs < ArraySize; runs++)
{

    terms[runs] = runs;

}

Đó sẽ là cách tôi mã hóa nó.


3

Mảng C # có độ dài cố định và luôn được lập chỉ mục. Đi với giải pháp của Motti's:

int [] terms = new int[400];
for(int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}

Lưu ý rằng mảng này là một mảng dày đặc, một khối liền kề 400 byte nơi bạn có thể thả mọi thứ. Nếu bạn muốn một mảng có kích thước động, hãy sử dụng Danh sách <int>.

List<int> terms = new List<int>();
for(int runs = 0; runs < 400; runs ++)
{
    terms.Add(runs);
}

Cả int [] và List <int> đều không phải là một mảng kết hợp - đó sẽ là một từ điển <> trong C #. Cả mảng và danh sách đều dày đặc.


2
int[] terms = new int[10]; //create 10 empty index in array terms

//fill value = 400 for every index (run) in the array
//terms.Length is the total length of the array, it is equal to 10 in this case 
for (int run = 0; run < terms.Length; run++) 
{
    terms[run] = 400;
}

//print value from each of the index
for (int run = 0; run < terms.Length; run++)
{
    Console.WriteLine("Value in index {0}:\t{1}",run, terms[run]);
}

Console.ReadLine();

/ * Kết quả đầu ra

Giá trị trong chỉ mục 0: 400
Giá trị trong chỉ mục 1: 400
Giá trị trong chỉ mục 2: 400
Giá trị trong chỉ mục 3: 400
Giá trị trong chỉ mục 4: 400
Giá trị trong chỉ mục 5: 400
Giá trị trong chỉ mục 6: 400
Giá trị trong chỉ mục 7: 400
Giá trị trong chỉ mục 7: 400 chỉ số 8: 400
Giá trị trong chỉ mục 9: 400
* /


Bạn có thể giải thích giải pháp này?
Deep Frozen

Rune, tôi vừa đưa bình luận vào bên trong mã nguồn> Hy vọng nó có thể trả lời câu hỏi của bạn.
jhyap

2

Bạn không thể chỉ cần thêm một phần tử vào một mảng dễ dàng. Bạn có thể đặt phần tử ở một vị trí nhất định như Fall888 đã phác thảo, nhưng tôi khuyên bạn nên sử dụng một List<int>hoặc Collection<int>thay thế và sử dụng ToArray()nếu bạn cần nó được chuyển đổi thành một mảng.


2

Nếu bạn thực sự cần một mảng thì đây là cách đơn giản nhất:

using System.Collections.Generic;

// Create a List, and it can only contain integers.
List<int> list = new List<int>();

for (int i = 0; i < 400; i++)
{
   list.Add(i);
}

int [] terms = list.ToArray();

2

Tôi sẽ thêm điều này cho một biến thể khác. Tôi thích loại dòng mã hóa chức năng hơn.

Enumerable.Range(0, 400).Select(x => x).ToArray();

1

Nếu bạn không biết kích thước của Mảng hoặc đã có sẵn một mảng mà bạn đang thêm vào. Bạn có thể đi về điều này theo hai cách. Đầu tiên là sử dụng chung List<T>: Để làm điều này, bạn sẽ muốn chuyển đổi mảng thành a var termsList = terms.ToList();và sử dụng phương thức Add. Sau đó, khi hoàn thành sử dụng var terms = termsList.ToArray();phương thức để chuyển đổi trở lại một mảng.

var terms = default(int[]);
var termsList = terms == null ? new List<int>() : terms.ToList();

for(var i = 0; i < 400; i++)
    termsList.Add(i);

terms = termsList.ToArray();

Cách thứ hai là thay đổi kích thước mảng hiện tại:

var terms = default(int[]);

for(var i = 0; i < 400; i++)
{
    if(terms == null)
        terms = new int[1];
    else    
        Array.Resize<int>(ref terms, terms.Length + 1);

    terms[terms.Length - 1] = i;
}

Nếu bạn đang sử dụng .NET 3.5 Array.Add(...);

Cả hai điều này sẽ cho phép bạn làm điều đó một cách linh hoạt. Nếu bạn sẽ thêm nhiều mục thì chỉ cần sử dụng a List<T>. Nếu nó chỉ là một vài mục thì nó sẽ có hiệu suất thay đổi kích thước mảng tốt hơn. Điều này là do bạn mất nhiều thời gian hơn để tạo List<T>đối tượng.

Thời gian trong tích tắc:

3 mục

Thời gian thay đổi kích thước mảng: 6

Danh sách Thêm thời gian: 16

400 mặt hàng

Thời gian thay đổi kích thước mảng: 305

Danh sách Thêm thời gian: 20


1

Chỉ là một cách tiếp cận khác nhau:

int runs = 0; 
bool batting = true; 
string scorecard;

while (batting = runs < 400)
    scorecard += "!" + runs++;

return scorecard.Split("!");

3
Trong khi hơi mới lạ, điều này đang thực hiện rất nhiều chuỗi nối và sau đó thực hiện một hoạt động liệt kê lớn! Không phải là cách hiệu quả nhất, hoặc dễ hiểu / dễ đọc về điều này.
BradleyDotNET

@Ali Humayun bạn có thực sự có ý định sử dụng toán tử gán =thay vì toán tử so sánh không? Bạn có thể bỏ qua biến số chiến đấu và sử dụng runs < 400để điều khiển vòng lặp.
Steve

chỉ cần thực hành lập trình đôi người tham gia
Ali Humayun

1

Một cách tiếp cận là điền vào một mảng thông qua LINQ

nếu bạn muốn điền một mảng bằng một phần tử, bạn chỉ cần viết

string[] arrayToBeFilled;
arrayToBeFilled= arrayToBeFilled.Append("str").ToArray();

hơn nữa, nếu bạn muốn điền vào một mảng với nhiều phần tử, bạn có thể sử dụng mã trước đó trong một vòng lặp

//the array you want to fill values in
string[] arrayToBeFilled;
//list of values that you want to fill inside an array
List<string> listToFill = new List<string> { "a1", "a2", "a3" };
//looping through list to start filling the array

foreach (string str in listToFill){
// here are the LINQ extensions
arrayToBeFilled= arrayToBeFilled.Append(str).ToArray();
}

0
int[] terms = new int[400];

for(int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}

0
         static void Main(string[] args)
        {
            int[] arrayname = new int[5];/*arrayname is an array of 5 integer [5] mean in array [0],[1],[2],[3],[4],[5] because array starts with zero*/
            int i, j;


          /*initialize elements of array arrayname*/
            for (i = 0; i < 5; i++)
            {
                arrayname[i] = i + 100;
            }

             /*output each array element value*/
            for (j = 0; j < 5; j++)
            {
                Console.WriteLine("Element and output value [{0}]={1}",j,arrayname[j]);
            }
            Console.ReadKey();/*Obtains the next character or function key pressed by the user.
                                The pressed key is displayed in the console window.*/
        }

0
            /*arrayname is an array of 5 integer*/
            int[] arrayname = new int[5];
            int i, j;
            /*initialize elements of array arrayname*/
            for (i = 0; i < 5; i++)
            {
                arrayname[i] = i + 100;
            }

0

Để thêm các giá trị danh sách vào mảng chuỗi bằng C # mà không sử dụng phương thức ToArray ()

        List<string> list = new List<string>();
        list.Add("one");
        list.Add("two");
        list.Add("three");
        list.Add("four");
        list.Add("five");
        string[] values = new string[list.Count];//assigning the count for array
        for(int i=0;i<list.Count;i++)
        {
            values[i] = list[i].ToString();
        }

Đầu ra của mảng giá trị chứa:

một

hai

số ba

bốn

số năm

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.