อาร์เรย์แบบไดนามิกใน C #


112

มีวิธีการสร้างอาร์เรย์แบบไดนามิกใน C # หรือไม่?


1
หากคุณยังติดอยู่ในโคลนเก่าโดยใช้ [] แทนถ้า List <> คุณสามารถใช้ Array.Resize () นี่คือตัวอย่างที่ดี dotnetperls.com/array-resize
Gian

ลิงก์ dotnetperls.com/array-resize ใช้งานไม่ได้ (FYI)
Su Llewellyn

คำตอบ:


150

ลองดูที่รายการทั่วไป


13
คำถาม (แม้ว่าจะสั้นและไม่สามารถอธิบายได้) ไม่ได้ถามเกี่ยวกับรายการทั่วไป - คำถามอาจถามเกี่ยวกับdynamic[] msdn.microsoft.com/en-GB/library/dd264736.aspx (อาร์เรย์ประเภทไดนามิก) หรือExpandoObject msdn.microsoft.com/ en-us / library / …ฉันสามารถ -1 คำตอบที่ไม่ได้กล่าวถึงสิ่งเหล่านี้
Luke T O'Brien

6
@ LukeTO'Brien พลศาสตร์ถูกนำมาใช้ใน C # 4.0 ซึ่งเปิดตัวหนึ่งปีเต็มหลังจากที่คำถามนี้ถูกถามในตอนแรก OP อาจถามเกี่ยวกับโครงสร้างข้อมูลที่ปรับขนาดได้เช่นen.wikipedia.org/wiki/Dynamic_array
Brian Merrell

6
คำตอบที่ประกอบด้วยลิงก์ไปยังบทความเท่านั้นไม่เป็นประโยชน์ ไม่มีการรับประกันว่าลิงก์จะยังคงใช้งานได้
JamEngulfer

@JamEngulfer นั่นไม่จริง หากข้อความลิงก์ของเขาคือ "ดูสิ่งนี้" โดยมีลิงก์ "นี้" แสดงว่าฉันเห็นด้วยกับคุณ หากคุณลบลิงก์ออกและดูสิ่งที่เหลืออยู่คำตอบของ OP สำหรับ "ดูรายการทั่วไป" เป็นข้อมูลมากมายที่จะช่วยให้ผู้อ่านทุกคนได้รับ googling ในอนาคต ....
Lynn Crumbling

88

ขยายคำตอบของ Chris และ Migol ด้วยตัวอย่างโค้ด

การใช้อาร์เรย์

Student[] array = new Student[2];
array[0] = new Student("bob");
array[1] = new Student("joe");

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

List<Student> list = new List<Student>();
list.Add(new Student("bob"));
list.Add(new Student("joe"));
Student joe = list[1];

2
ตัวอย่างนี้ไม่ดีนักเพราะเราทั้งคู่พูดถึง ArrayList
Migol

21
คำตอบนี้ดีกว่าของคุณ @Migol เพราะนี่แสดงวิธีใช้รายการ <> จริง ๆ แทนที่จะพูดถึงมันเป็นคำหลัก "half-bad" -> "half-good" -> good
fhugas

56

บางครั้งอาร์เรย์ธรรมดาเป็นที่ต้องการสำหรับรายการทั่วไปเนื่องจากสะดวกกว่า (ประสิทธิภาพที่ดีกว่าสำหรับการคำนวณราคาแพง - แอปพลิเคชันพีชคณิตเชิงตัวเลขหรือสำหรับการแลกเปลี่ยนข้อมูลกับซอฟต์แวร์สถิติเช่น R หรือ Matlab)

ในกรณีนี้คุณอาจใช้วิธี ToArray () หลังจากเริ่มรายการของคุณแบบไดนามิก

List<string> list = new List<string>();
list.Add("one");
list.Add("two");
list.Add("three");

string[] array = list.ToArray();

ของหลักสูตรนี้มีความรู้สึก แต่ถ้าขนาดของอาร์เรย์จะไม่เคยรู้จักหรือถาวรอดีต ante หากคุณทราบขนาดของอาร์เรย์ของคุณในบางจุดของโปรแกรมแล้วจะเป็นการดีกว่าที่จะเริ่มต้นเป็นอาร์เรย์ที่มีความยาวคงที่ (หากคุณดึงข้อมูลจาก ResultSet เป็นต้นคุณสามารถนับขนาดและเริ่มต้นอาร์เรย์ขนาดนั้นแบบไดนามิก)


1
ไม่คุ้มค่าตราบใดที่คุณใช้ตัวสร้างดัชนี
aaimnr

2
Ararys ไม่สะดวกกว่า (มีอินเทอร์เฟซย่อย List <T>) และมีประสิทธิภาพเกือบเท่ากันเนื่องจาก List <T> ใช้อาร์เรย์ปกติที่อยู่ข้างใต้ การทำซ้ำสำหรับองค์ประกอบ 6000000: List / for: 1971ms Array / for: 1864ms (Benchmark from stackoverflow.com/questions/454916/… )
aaimnr

9
หากคุณต้องส่งอาร์เรย์ไปยังอินเทอร์เฟซนั้นจะต้องเป็นอาร์เรย์ การสร้างรายการนั้นง่ายกว่ามากจากนั้นทำให้เป็นอาร์เรย์ก่อนที่คุณจะส่งผ่าน ฉันชอบคำตอบนี้มากกว่าคำตอบอื่น ๆ เพราะมันตอบโจทย์!
Michael Stimson

36

List<T>สำหรับการพิมพ์อย่างรุนแรงหรือArrayListหากคุณมี. NET 1.1 หรือชอบที่จะแคสต์ตัวแปร


2

ตัวอย่างอาร์เรย์แบบไดนามิก:

Console.WriteLine("Define Array Size? ");
int number = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Enter numbers:\n");
int[] arr = new int[number];

for (int i = 0; i < number; i++)
{
    arr[i] = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i < arr.Length; i++ )
{
    Console.WriteLine("Array Index: "+i + " AND Array Item: " + arr[i].ToString());
}
Console.ReadKey();

2

คุณสามารถทำได้กับวัตถุไดนามิก:

var dynamicKeyValueArray = new[] { new {Key = "K1", Value = 10}, new {Key = "K2", Value = 5} };

foreach(var keyvalue in dynamicKeyValueArray)
{
    Console.Log(keyvalue.Key);
    Console.Log(keyvalue.Value);
}

1

ใช้รายการอาร์เรย์ซึ่งเป็นการนำอาร์เรย์ไปใช้จริง เริ่มแรกจะใช้อาร์เรย์ขนาด 4 และเมื่อเต็มอาร์เรย์ใหม่จะถูกสร้างขึ้นโดยมีขนาดสองเท่าและข้อมูลของอาร์เรย์แรกจะถูกคัดลอกไปยังอาร์เรย์ที่สองตอนนี้รายการใหม่จะถูกแทรกลงในอาร์เรย์ใหม่ นอกจากนี้ชื่อของอาร์เรย์ที่สองจะสร้างนามแฝงของชื่อแรกเพื่อให้สามารถเข้าถึงได้โดยใช้ชื่อเดียวกับก่อนหน้านี้และอาร์เรย์แรกจะถูกกำจัด


1

คุณสามารถใช้วัตถุอาร์เรย์จากคลาสคอลเลกชัน

using system.collections;
   static void main()
        {
        Arrylist arr=new Arrylist();
         }

คุณต้องการเพิ่มองค์ประกอบที่คุณสามารถใช้ได้

arr.add();

0

คำตอบนี้ดูเหมือนจะเป็นคำตอบที่คุณกำลังมองหา Why I can't do this: dynamic x = new ExpandoObject {Foo = 12, Bar = "twelve"}

อ่านเกี่ยวกับที่ExpandoObjectนี่https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject(v=vs.110).aspx

และdynamicประเภทที่นี่https://msdn.microsoft.com/en-GB/library/dd264736.aspx

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