การเพิ่มค่าให้กับอาร์เรย์ C #


511

อาจเป็นเรื่องง่าย ๆ แบบนี้ - ฉันเริ่มต้นด้วย C # และต้องการเพิ่มค่าให้กับอาร์เรย์ตัวอย่างเช่น:

int[] terms;

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

สำหรับผู้ที่ใช้ PHP นี่คือสิ่งที่ฉันพยายามทำใน C #:

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

10
ไม่ควร 'เงื่อนไข [] = ค่า;' เป็น 'ข้อตกลง [] = ทำงาน;'?
tymtam

ใน C # คุณไม่สามารถเปลี่ยนขนาดอาร์เรย์ได้เมื่อถูกสร้างขึ้น หากคุณต้องการบางอย่างเช่นอาร์เรย์ แต่สามารถเพิ่ม / ลบองค์ประกอบใช้รายการ <int> ()
Kamran Bigdely

คำตอบ:


822

คุณสามารถทำเช่นนี้ได้ -

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

หรือคุณสามารถใช้รายการ - ข้อดีของการเป็นรายการคุณไม่จำเป็นต้องทราบขนาดของอาเรย์เมื่อสร้างรายการขึ้นมา

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();

แก้ไข: ก) สำหรับลูปในรายการ <T> จะถูกกว่า 2 เท่าราคาถูกกว่าลูปด้านหน้าแต่ละรายการ <T>, b) การวนรอบบนอาร์เรย์มีราคาถูกกว่าการวนลูปในรายการ <T>, c 2) อาร์เรย์ที่ใช้สำหรับคือ 5 ครั้งราคาถูกกว่าการวนซ้ำในรายการ <T> ใช้foreach (ซึ่งส่วนใหญ่เราใช้)


1
ประโยชน์ของการใช้รายการในสถานการณ์นี้คืออะไร?
Phill Healey

9
@PhillHealey คุณไม่ต้อง "รู้" ว่าอาเรย์นั้นจะใหญ่ขนาดไหนก่อนที่คุณจะสร้างมันขึ้นมา อย่างที่คุณเห็นในตัวอย่างเหล่านี้ OP ต้องใส่ค่าลงใน "new int [400]" - แต่ด้วยรายการเขาไม่จำเป็นต้องทำเช่นนั้น
Hejner

3
จะไม่เป็นบิตแรกของรหัสเพราะจะไม่มีการกำหนดค่าใด ๆ -_-
EasyBB

1
ทำไมคุณพูดว่า ARRAY ต้องมีขนาด ??? แค่ทำnew int[]{}!!!!!
T.Todua

6
@ T.Todua หากคุณสร้างอาเรย์ที่ว่างเปล่าอย่างที่คุณกำลังแนะนำแล้วลองเข้าถึงมันเป็นดัชนีที่ไม่มีอยู่เพื่อกำหนดค่าคุณจะได้รับOutOfRangeExceptionทันทีที่คุณเรียกใช้รหัส อาเรย์ต้องเริ่มต้นด้วยขนาดที่คุณจะใช้มันจองพื้นที่ทั้งหมดในตอนเริ่มต้นแม่มดทำให้มันเร็วมาก แต่ไม่สามารถปรับขนาดได้
KinSlayerUY

85

หากคุณเขียนด้วยภาษา C # 3 คุณสามารถทำได้โดยใช้สายการบินเดียว

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

ข้อมูลโค้ดนี้จะถือว่าคุณใช้ directive สำหรับ System.Linq ที่ด้านบนของไฟล์ของคุณ

ในทางกลับกันหากคุณกำลังมองหาบางสิ่งที่สามารถปรับขนาดแบบไดนามิกตามที่ปรากฏเป็นกรณีสำหรับ PHP (ฉันไม่เคยเรียนรู้จริง) จากนั้นคุณอาจต้องการใช้รายการแทน int [] . นี่คือรหัสที่มีลักษณะ:

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

อย่างไรก็ตามโปรดทราบว่าคุณไม่สามารถเพิ่มองค์ประกอบ 401st เพียงแค่ตั้งค่าเงื่อนไข [400] เป็นค่า คุณต้องโทรหา Add () เช่นนี้แทน:

terms.Add(1337);

65

การใช้วิธีการของLinq Concatทำให้วิธีนี้ง่าย

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

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

ผล 3,4,2


12
วิธีนี้จะทำให้การเพิ่ม 400 รายการในอาเรย์สร้างสำเนาของอาเรย์ด้วยพื้นที่เพิ่มอีกหนึ่งรายการและย้ายองค์ประกอบทั้งหมดไปยังอาเรย์ใหม่ 400 ร้อยครั้ง ดังนั้นจึงไม่แนะนำประสิทธิภาพที่ชาญฉลาด
KinSlayerUY

39

คำตอบเกี่ยวกับวิธีการใช้อาเรย์มีให้ที่นี่

อย่างไรก็ตาม C # มีสิ่งที่มีประโยชน์มากที่เรียกว่า System.Collections :)

คอลเลกชันเป็นทางเลือกแฟนซีในการใช้อาเรย์แม้ว่าหลาย ๆ คนจะใช้อาเรย์ภายใน

ตัวอย่างเช่น C # มีการรวบรวมรายการที่เรียกว่าทำงานคล้ายกับอาร์เรย์ 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);
}

สำหรับดึงองค์ประกอบรายการ: int a = list [i];
Behzad

10

การใช้ List เป็นตัวกลางเป็นวิธีที่ง่ายที่สุดดังที่คนอื่น ๆ ได้อธิบายไว้ แต่เนื่องจากการป้อนข้อมูลของคุณเป็นอาร์เรย์และคุณไม่ต้องการเก็บข้อมูลไว้ในรายการฉันคิดว่าคุณอาจกังวลเกี่ยวกับประสิทธิภาพ

วิธีที่มีประสิทธิภาพมากที่สุดคือการจัดสรรอาเรย์ใหม่แล้วใช้ Array.Copy หรือ Array.CopyTo นี่ไม่ใช่เรื่องยากหากคุณต้องการเพิ่มรายการไว้ท้ายรายการ:

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;
}

ฉันยังสามารถโพสต์รหัสสำหรับส่วนขยายแทรกที่ใช้ดัชนีปลายทางเป็นอินพุตได้หากต้องการ มันซับซ้อนกว่านี้เล็กน้อยและใช้ static method Array.Copy 1-2 ครั้ง


2
มันจะดีกว่ามากประสิทธิภาพที่ชาญฉลาดในการสร้างรายการเติมมันแล้วทำสำเนานี้ไปยังอาร์เรย์ในตอนท้ายดังนั้นคุณไม่ได้สร้างและคัดลอกอาร์เรย์ซ้ำไปซ้ำมา 400 ครั้ง
KinSlayerUY

10

ตามคำตอบของ Thracx (ฉันไม่มีคะแนนเพียงพอที่จะตอบ):

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;
    }

สิ่งนี้อนุญาตให้เพิ่มมากกว่าหนึ่งไอเท็มไปยังอาร์เรย์หรือเพียงส่งผ่านอาร์เรย์เป็นพารามิเตอร์เพื่อเข้าร่วมสองอาร์เรย์


8

คุณต้องจัดสรรอาร์เรย์ก่อน:

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;

}

นั่นจะเป็นวิธีที่ฉันจะเขียนโค้ด


3

อาร์เรย์ C # มีความยาวคงที่และจัดทำดัชนีไว้เสมอ ไปกับทางออกของ Motti:

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

โปรดทราบว่าอาเรย์นี้เป็นอาเรย์ที่มีความหนาแน่นสูงบล็อกที่ต่อเนื่องกัน 400 ไบต์ซึ่งคุณสามารถวางสิ่งต่างๆได้ ถ้าคุณต้องการอาร์เรย์ที่มีขนาดแบบไดนามิกให้ใช้ List <int>

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

int [] และ List <int> เป็นอาร์เรย์ที่เชื่อมโยงซึ่งจะเป็นพจนานุกรม <> ใน 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();

/ * ขาออก

ค่าในดัชนี 0: 400
ค่าในดัชนี 1: 400
ค่าในดัชนี 2: 400
ค่าในดัชนี 3: 400
ค่าในดัชนี 4: 400
ค่าในดัชนี 5: 400
ค่าในดัชนี 6: 400
ค่าในดัชนี 7: 400
ค่าใน ดัชนี 8: 400
ค่าในดัชนี 9: 400
* /


คุณช่วยอธิบายวิธีนี้ได้ไหม
Deep Frozen

รูนฉันเพิ่งรวมความคิดเห็นไว้ในซอร์สโค้ด> หวังว่ามันจะสามารถตอบคำถามของคุณได้
jhyap

2

คุณไม่สามารถเพิ่มองค์ประกอบลงในอาร์เรย์ได้อย่างง่ายดาย คุณสามารถตั้งค่าองค์ประกอบที่ตำแหน่งที่กำหนดตามที่ตกลงไว้888แต่ฉันแนะนำให้ใช้ a List<int>หรือ a Collection<int>แทนและใช้ToArray()ถ้าคุณต้องการให้มันแปลงเป็นอาร์เรย์


2

หากคุณต้องการอาร์เรย์จริงๆสิ่งต่อไปนี้น่าจะง่ายที่สุด:

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

ฉันจะเพิ่มสิ่งนี้สำหรับตัวแปรอื่น ฉันชอบสายการเข้ารหัสที่ใช้งานได้มากกว่านี้

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

1

หากคุณไม่ทราบขนาดของอาร์เรย์หรือมีอาร์เรย์ที่มีอยู่แล้วที่คุณกำลังเพิ่ม คุณสามารถทำสิ่งนี้ได้สองวิธี แรกคือการใช้ทั่วไปList<T>: การทำเช่นนี้คุณจะต้องการแปลงอาร์เรย์เป็นvar termsList = terms.ToList();และใช้วิธีการเพิ่ม จากนั้นเมื่อเสร็จแล้วใช้var terms = termsList.ToArray();วิธีการในการแปลงกลับเป็นอาร์เรย์

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();

วิธีที่สองคือการปรับขนาดอาร์เรย์ปัจจุบัน:

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;
}

หากคุณใช้. NET 3.5 Array.Add(...);

ทั้งสองอย่างนี้จะช่วยให้คุณทำแบบไดนามิก List<T>หากคุณจะเพิ่มจำนวนมากของรายการจากนั้นเพียงแค่ใช้ หากเป็นเพียงสองสามรายการก็จะมีประสิทธิภาพที่ดีขึ้นในการปรับขนาดอาร์เรย์ นี่เป็นเพราะคุณใช้เวลามากในการสร้างList<T>วัตถุ

เวลา ในเห็บ:

3 รายการ

เวลาปรับขนาดอาร์เรย์: 6

รายการเพิ่มเวลา: 16

400 รายการ

เวลาในการปรับขนาดอาร์เรย์: 305

รายการเพิ่มเวลา: 20


1

เป็นวิธีที่แตกต่าง:

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

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

return scorecard.Split("!");

3
ในขณะที่นวนิยายเล็กน้อยนี่คือการดำเนินการเรียงต่อกันของสตริงจำนวนมากแล้วดำเนินการแจงนับขนาดใหญ่! ไม่ใช่วิธีที่มีประสิทธิภาพมากที่สุดหรือเข้าใจได้ง่าย / เข้าใจได้ในเรื่องนี้
BradleyDotNET

@Ali Humayun คุณตั้งใจจะใช้ตัวดำเนินการที่มอบหมาย=แทนตัวดำเนินการเปรียบเทียบหรือไม่ คุณสามารถออกจากตัวแปรต่อสู้และใช้runs < 400ในการควบคุมวง
Steve

เพิ่งฝึกเขียนโปรแกรมสองรายการ
อาลี Humayun

1

วิธีหนึ่งคือการเติมอาร์เรย์ผ่าน LINQ

ถ้าคุณต้องการเติมอาร์เรย์ด้วยองค์ประกอบหนึ่งคุณก็สามารถเขียน

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

นอกจากนี้หากคุณต้องการที่จะเติมอาเรย์หลายองค์ประกอบคุณสามารถใช้รหัสก่อนหน้าในการวนซ้ำ

//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
         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

เพื่อเพิ่มค่ารายการไปยังอาร์เรย์สตริงโดยใช้ 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();
        }

เอาต์พุตของอาร์เรย์ค่าประกอบด้วย:

หนึ่ง

สอง

สาม

สี่

ห้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.