วิธีการเริ่มต้นรายการ <T> เป็นขนาดที่กำหนด (เมื่อเทียบกับความจุ)


112

.NET นำเสนอคอนเทนเนอร์รายการทั่วไปที่มีประสิทธิภาพเกือบเหมือนกัน (ดูคำถามประสิทธิภาพของอาร์เรย์เทียบกับรายการ) อย่างไรก็ตามมันค่อนข้างแตกต่างกันในการเริ่มต้น

อาร์เรย์เป็นเรื่องง่ายมากที่จะเริ่มต้นด้วยค่าเริ่มต้นและตามความหมายพวกเขามีขนาดที่แน่นอนแล้ว:

string[] Ar = new string[10];

ซึ่งช่วยให้สามารถกำหนดรายการแบบสุ่มได้อย่างปลอดภัยพูดว่า:

Ar[5]="hello";

ด้วยรายการสิ่งที่ยุ่งยากกว่า ฉันสามารถเห็นสองวิธีในการเริ่มต้นเดียวกันซึ่งทั้งสองวิธีนี้ไม่ใช่สิ่งที่คุณเรียกว่าสง่างาม:

List<string> L = new List<string>(10);
for (int i=0;i<10;i++) L.Add(null);

หรือ

string[] Ar = new string[10];
List<string> L = new List<string>(Ar);

อะไรจะเป็นวิธีที่สะอาดกว่านี้?

แก้ไข: คำตอบจนถึงตอนนี้อ้างถึงความจุซึ่งเป็นอย่างอื่นที่ไม่ใช่การเติมรายการล่วงหน้า ตัวอย่างเช่นในรายการที่เพิ่งสร้างขึ้นโดยมีความจุ 10 รายการไม่สามารถทำได้L[2]="somevalue"

แก้ไข 2: ผู้คนสงสัยว่าทำไมฉันถึงต้องการใช้รายการด้วยวิธีนี้เนื่องจากไม่ใช่วิธีที่พวกเขาตั้งใจจะใช้ ฉันเห็นเหตุผลสองประการ:

  1. คนหนึ่งสามารถโต้แย้งได้อย่างน่าเชื่อว่ารายการเป็นอาร์เรย์ "รุ่นต่อไป" โดยเพิ่มความยืดหยุ่นโดยแทบไม่มีการลงโทษ ดังนั้นควรใช้เป็นค่าเริ่มต้น ฉันกำลังชี้ให้เห็นว่าอาจไม่ง่ายในการเริ่มต้น

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


1
"แก้ไข: คำตอบจนถึงตอนนี้อ้างถึงความจุซึ่งเป็นอย่างอื่นที่ไม่ใช่การเติมข้อมูลล่วงหน้าในรายการตัวอย่างเช่นในรายการที่เพิ่งสร้างด้วยความจุ 10 ไม่มีใครทำ L [2] =" somevalue "" ให้ การปรับเปลี่ยนบางทีคุณควรเปลี่ยนชื่อคำถาม ...
aranasaurus

แต่การใช้การเติมรายการล่วงหน้าด้วยค่าว่างคืออะไรสาเหตุนั่นคือสิ่งที่ topicstarter พยายามทำ?
Frederik Gheysels

1
ถ้าการแมปตำแหน่งมีความสำคัญมากการใช้ Dictionary <int, string> จะเหมาะสมกว่าหรือไม่?
Greg D

7
Listไม่สามารถทดแทนArrayได้ พวกเขาแก้ปัญหาที่แยกจากกันอย่างชัดเจน หากคุณต้องการขนาดคงที่คุณต้องการขนาดArray. หากคุณใช้ a แสดงListว่าคุณทำผิด
Zenexer

5
ฉันมักจะพบคำตอบที่พยายามจะโต้เถียงเช่น "ฉันไม่เห็นว่าทำไมฉันถึงต้องการ ... " ซ้ำเติม มีความหมายเพียงแค่นั้นคุณมองไม่เห็น มันไม่จำเป็นต้องมีความหมายอย่างอื่น ฉันเคารพที่ผู้คนต้องการเสนอแนวทางที่ดีกว่าในการแก้ปัญหา แต่ควรใช้วลีที่ถ่อมตัวมากกว่านี้เช่น "คุณแน่ใจหรือไม่ว่าคุณต้องการรายชื่อหรือบางทีถ้าคุณบอกเราเพิ่มเติมเกี่ยวกับปัญหาของคุณ ... " วิธีนี้จะเป็นที่น่าพอใจมีส่วนร่วมและกระตุ้นให้ OP ปรับปรุงคำถามของพวกเขา เป็นผู้ชนะ - จงถ่อมตัว
AnorZaken

คำตอบ:


79

ฉันไม่สามารถพูดได้ว่าฉันต้องการสิ่งนี้บ่อยนัก - คุณสามารถให้รายละเอียดเพิ่มเติมว่าทำไมคุณถึงต้องการสิ่งนี้? ฉันอาจกำหนดให้เป็นวิธีการคงที่ในคลาสตัวช่วย:

public static class Lists
{
    public static List<T> RepeatedDefault<T>(int count)
    {
        return Repeated(default(T), count);
    }

    public static List<T> Repeated<T>(T value, int count)
    {
        List<T> ret = new List<T>(count);
        ret.AddRange(Enumerable.Repeat(value, count));
        return ret;
    }
}

คุณสามารถใช้Enumerable.Repeat(default(T), count).ToList()แต่ที่จะไม่มีประสิทธิภาพเนื่องจากการปรับขนาดบัฟเฟอร์

โปรดทราบว่าหากTเป็นประเภทการอ้างอิงจะจัดเก็บcountสำเนาของการอ้างอิงที่ส่งผ่านสำหรับvalueพารามิเตอร์ดังนั้นทั้งหมดจะอ้างถึงวัตถุเดียวกัน นั่นอาจใช่หรือไม่ใช่สิ่งที่คุณต้องการขึ้นอยู่กับกรณีการใช้งานของคุณ

แก้ไข: ตามที่ระบุไว้ในความคิดเห็นคุณสามารถRepeatedใช้การวนซ้ำเพื่อเติมข้อมูลในรายการได้หากต้องการ นั่นจะเร็วกว่าเล็กน้อยด้วย โดยส่วนตัวแล้วฉันพบรหัสโดยใช้Repeatคำอธิบายมากกว่าและสงสัยว่าในโลกแห่งความเป็นจริงความแตกต่างของประสิทธิภาพจะไม่เกี่ยวข้อง แต่ระยะทางของคุณอาจแตกต่างกันไป


1
ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันอยากรู้อยากเห็น นับได้การทำซ้ำค่าโดยสารแย่กว่ามากเมื่อเทียบกับสำหรับลูปตามส่วนสุดท้ายของลิงก์ ( dotnetperls.com/initialize-array ) นอกจากนี้ AddRange () ยังมีความซับซ้อน O (n) ตาม msdn การใช้โซลูชันที่กำหนดแทนการวนซ้ำแบบธรรมดาไม่ได้ผลหรือไม่?
Jimmy

@ จิมมี่: ทั้งสองแนวทางจะเป็น O (n) และฉันพบว่าแนวทางนี้จะอธิบายสิ่งที่ฉันพยายามบรรลุได้มากขึ้น หากคุณต้องการวนซ้ำอย่าลังเลที่จะใช้มัน
Jon Skeet

@ จิมมี่: โปรดทราบว่าเกณฑ์มาตรฐานที่ใช้Enumerable.Repeat(...).ToArray()อยู่ซึ่งไม่ใช่วิธีที่ฉันใช้
Jon Skeet

1
ฉันใช้Enumerable.Repeat()วิธีต่อไปนี้ (ใช้งานPairเหมือนกับ C ++ ที่เทียบเท่า): Enumerable.Repeat( new Pair<int,int>(int.MaxValue,-1), costs.Count)สังเกตเห็นผลข้างเคียงว่าListสำเนาที่อ้างถึงนั้นเต็มไปยังวัตถุชิ้นเดียว เปลี่ยนองค์ประกอบเช่นการเปลี่ยนแปลงทุกองค์ประกอบเดียวในทั้งหมดmyList[i].First = 1 Listฉันใช้เวลาหลายชั่วโมงในการค้นหาจุดบกพร่องนี้ คุณผู้ชายรู้ว่าวิธีการแก้ปัญหาใด ๆ กับปัญหานี้ (ยกเว้นเพียงแค่ใช้ห่วงที่พบบ่อยและการใช้งาน.Add(new Pair...)?
00zetti

1
@ Pac0 ฉันเพิ่งเพิ่มคำตอบด้านล่าง การแก้ไขอาจไม่ได้รับการอนุมัติ
Jeremy Ray Brown

136
List<string> L = new List<string> ( new string[10] );

3
โดยส่วนตัวแล้วฉันคิดว่านี่เป็นวิธีที่สะอาดที่สุด - แม้ว่าจะมีการกล่าวถึงในเนื้อหาคำถามว่าอาจงุ่มง่าม - ไม่รู้ว่าทำไม
hello_earth

4
+1: เพิ่งเจอสถานการณ์ที่ฉันต้องการรายการขนาดตัวแปรเพื่อเริ่มต้นด้วยชุดค่าว่างคงที่ก่อนที่จะเติมข้อมูลผ่านดัชนี (และเพิ่มส่วนเสริมในภายหลังดังนั้นอาร์เรย์จึงไม่เหมาะสม) คำตอบนี้ทำให้ฉันได้รับการโหวตว่าเป็นประโยชน์และเรียบง่าย
Gone Coding

คำตอบที่ยอดเยี่ยม @GoneCoding ฉันแค่สงสัยว่าภายในรายการที่เริ่มต้นใหม่Lจะใช้หน่วยความจำstring[10]ตามที่เป็นอยู่หรือไม่ (ที่เก็บสำรองของรายการเป็นอาร์เรย์) หรือจะจัดสรรหน่วยความจำใหม่ของตัวเองแล้วคัดลอกเนื้อหาของstring[10]? string[10]จะได้รับขยะที่รวบรวมโดยอัตโนมัติหากLเลือกเส้นทางในภายหลัง
RBT

3
@RBT นั่นเป็นข้อเสียเพียงประการเดียวของแนวทางนี้: อาร์เรย์จะไม่ถูกใช้ซ้ำดังนั้นในไม่ช้าคุณจะมีสำเนาอาร์เรย์สองชุด (รายการใช้อาร์เรย์ภายในตามที่คุณทราบ) ในกรณีที่หายากที่อาจจะมีปัญหาถ้าคุณมีขนาดใหญ่จำนวนขององค์ประกอบหรือข้อ จำกัด ของหน่วยความจำ และใช่อาร์เรย์พิเศษจะมีสิทธิ์ได้รับการรวบรวมขยะทันทีที่ตัวสร้างรายการเสร็จสิ้น (อาจเป็นการรั่วไหลของหน่วยความจำที่น่ากลัว) โปรดทราบว่ามีสิทธิ์ไม่ได้หมายถึง "รวบรวมทันที" แต่เป็นการเรียกเก็บขยะในครั้งถัดไป
AnorZaken

2
คำตอบนี้จะจัดสรรสตริงใหม่ 10 สตริงจากนั้นจะทำซ้ำทับพวกเขาคัดลอกตามความต้องการ หากคุณกำลังทำงานกับอาร์เรย์ขนาดใหญ่ จากนั้นอย่าพิจารณาสิ่งนี้ด้วยซ้ำเพราะมันต้องการหน่วยความจำมากกว่าคำตอบที่ยอมรับถึงสองเท่า
UKMonkey

22

ใช้ตัวสร้างซึ่งรับ int ("ความจุ") เป็นอาร์กิวเมนต์:

List<string> = new List<string>(10);

แก้ไข: ฉันควรเพิ่มว่าฉันเห็นด้วยกับ Frederik คุณกำลังใช้รายการในลักษณะที่ขัดต่อเหตุผลทั้งหมดที่อยู่เบื้องหลังการใช้รายการนี้ในตอนแรก

แก้ไข 2:

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

ทำไมทุกคนต้องรู้ขนาดของรายการที่มีค่าว่างทั้งหมด? หากไม่มีค่าจริงในรายการฉันคาดว่าความยาวจะเป็น 0 อย่างไรก็ตามความจริงที่ว่านี่เป็นเรื่องเหลวไหลแสดงให้เห็นว่ามันขัดต่อการใช้คลาสที่ตั้งใจไว้


46
คำตอบนี้ไม่ได้จัดสรร 10 รายการว่างในรายการ (ซึ่งเป็นข้อกำหนด) เพียงแค่จัดสรรพื้นที่สำหรับ 10 รายการก่อนที่จะต้องมีการปรับขนาดรายการ (เช่นความจุ) ดังนั้นสิ่งนี้จึงไม่แตกต่างnew List<string>()จากปัญหาเท่าที่เกิดขึ้น . ทำได้ดีมากที่ได้รับคะแนนโหวตเพิ่มขึ้นมากมาย :)
Gone Coding

2
คอนสตรัคที่มากเกินไปคือ "ความจุเริ่มต้น" ค่าไม่ได้ "ขนาด" หรือ "ความยาว" และมันไม่ได้ Initialise รายการอย่างใดอย่างหนึ่ง
แมตต์ Wilko

เพื่อตอบว่า "ทำไมใครบางคนถึงต้องการสิ่งนี้": ตอนนี้ฉันต้องการสิ่งนี้ในการโคลนโครงสร้างข้อมูลโครงสร้างแบบลึก โหนดอาจเติมหรือไม่ใส่ลูกของมัน แต่คลาสโหนดฐานของฉันจำเป็นต้องสามารถโคลนตัวเองด้วยโหนดลูกทั้งหมด บลา ๆ มันซับซ้อนกว่านั้น แต่ฉันต้องการทั้งสองเพื่อเติมข้อมูลรายการที่ยังว่างของฉันผ่านlist[index] = obj;และใช้ความสามารถอื่น ๆ ของรายการ
Bitterblue

3
@Bitterblue: นอกจากนี้การทำแผนที่ที่จัดสรรไว้ล่วงหน้าประเภทใด ๆ ที่คุณอาจไม่มีค่าทั้งหมดไว้ข้างหน้า มีประโยชน์อย่างแน่นอน; ฉันเขียนคำตอบนี้ในช่วงที่มีประสบการณ์น้อย
Ed S.

8

สร้างอาร์เรย์ด้วยจำนวนรายการที่คุณต้องการก่อนจากนั้นจึงแปลงอาร์เรย์เป็นรายการ

int[] fakeArray = new int[10];

List<int> list = fakeArray.ToList();

7

เหตุใดคุณจึงใช้รายการหากคุณต้องการเริ่มต้นด้วยค่าคงที่ ฉันเข้าใจได้ว่า - เพื่อประโยชน์ในการทำงาน - คุณต้องการเพิ่มขีดความสามารถเริ่มต้น แต่ก็ไม่ใช่ข้อดีอย่างหนึ่งของรายการเหนืออาร์เรย์ปกติที่สามารถเติบโตได้เมื่อจำเป็น?

เมื่อคุณทำสิ่งนี้:

List<int> = new List<int>(100);

คุณสร้างรายการที่มีความจุ 100 จำนวนเต็ม ซึ่งหมายความว่ารายการของคุณไม่จำเป็นต้อง 'เติบโต' จนกว่าคุณจะเพิ่มรายการที่ 101 อาร์เรย์พื้นฐานของรายการจะเริ่มต้นด้วยความยาว 100


1
"ทำไมคุณถึงใช้ List ถ้าคุณต้องการเริ่มต้นด้วยค่าคงที่" จุดที่ดี
Ed S.

7
เขาขอรายการที่แต่ละองค์ประกอบเริ่มต้นและรายการมีขนาดไม่ใช่แค่ความจุ คำตอบนี้ไม่ถูกต้องในขณะนี้
Nic Foster

คำถามต้องการคำตอบไม่ใช่วิจารณ์การถูกถาม บางครั้งก็มีเหตุผลที่ต้องทำเช่นนี้ซึ่งต่างจากการใช้อาร์เรย์ หากสนใจว่าเหตุใดจึงเป็นเช่นนั้นเราสามารถถามคำถาม Stack Overflow ได้
Dino Dini

5

การเริ่มต้นเนื้อหาของรายการเช่นนั้นไม่ใช่สิ่งที่รายการมีไว้สำหรับ รายการถูกออกแบบมาเพื่อเก็บวัตถุ หากคุณต้องการจับคู่ตัวเลขเฉพาะกับวัตถุบางอย่างให้พิจารณาใช้โครงสร้างคู่คีย์ - ค่าเช่นตารางแฮชหรือพจนานุกรมแทนรายการ


1
สิ่งนี้ไม่ได้ตอบคำถาม แต่ให้เหตุผลที่จะไม่ถามเท่านั้น
Dino Dini

5

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

Dictionary<int, string> foo = new Dictionary<int, string>();
foo[2] = "string";

นี่เป็นการตอบคำถามที่แตกต่างจากคำถามที่ถูกถาม
Dino Dini

4

หากคุณต้องการเริ่มต้นรายการด้วยองค์ประกอบ N ของค่าคงที่:

public List<T> InitList<T>(int count, T initValue)
{
  return Enumerable.Repeat(initValue, count).ToList();
}

ดูคำตอบของ John Skeet สำหรับข้อกังวลเกี่ยวกับการปรับขนาดบัฟเฟอร์ด้วยเทคนิคนี้
Amy B

1

คุณสามารถใช้ Linq เพื่อเริ่มต้นรายการของคุณอย่างชาญฉลาดด้วยค่าเริ่มต้น (คล้ายกับคำตอบของ David B )

var defaultStrings = (new int[10]).Select(x => "my value").ToList();

ไปอีกขั้นหนึ่งและเริ่มต้นแต่ละสตริงด้วยค่าที่แตกต่างกัน "string 1", "string 2", "string 3" ฯลฯ :

int x = 1;
var numberedStrings = (new int[10]).Select(x => "string " + x++).ToList();

1
string [] temp = new string[] {"1","2","3"};
List<string> temp2 = temp.ToList();

วิธีการเกี่ยวกับ List <string> temp2 = new List <string> (temp); เหมือนที่ OP แนะนำไปแล้ว.
Ed S.

Ed - อันนี้ตอบคำถามได้จริง - ซึ่งไม่เกี่ยวกับความจุ
Boaz

แต่ OP ระบุแล้วว่าไม่ชอบวิธีแก้ปัญหานี้
Ed S.

1

คำตอบที่ยอมรับ (คำตอบที่มีเครื่องหมายถูกสีเขียว) มีปัญหา

ปัญหา:

var result = Lists.Repeated(new MyType(), sizeOfList);
// each item in the list references the same MyType() object
// if you edit item 1 in the list, you are also editing item 2 in the list

ฉันขอแนะนำให้เปลี่ยนบรรทัดด้านบนเพื่อทำการคัดลอกวัตถุ มีบทความมากมายเกี่ยวกับเรื่องนี้:

หากคุณต้องการเริ่มต้นทุกรายการในรายการของคุณด้วยตัวสร้างเริ่มต้นแทนที่จะเป็น NULL ให้เพิ่มวิธีการต่อไปนี้:

public static List<T> RepeatedDefaultInstance<T>(int count)
    {
        List<T> ret = new List<T>(count);
        for (var i = 0; i < count; i++)
        {
            ret.Add((T)Activator.CreateInstance(typeof(T)));
        }
        return ret;
    }

1
ไม่ใช่ "ปัญหา" แต่เป็นพฤติกรรมปกติของการคัดลอกข้อมูลอ้างอิง โดยไม่ทราบสถานการณ์คุณไม่สามารถทราบได้ว่าเหมาะสมที่จะคัดลอกวัตถุหรือไม่ คำถามไม่ได้เกี่ยวกับว่ารายการควรเติมด้วยสำเนาหรือไม่ แต่เกี่ยวกับการเริ่มต้นรายการด้วยความจุ ฉันจะชี้แจงคำตอบของฉันในแง่ของพฤติกรรมมันไม่ได้มี แต่ผมไม่คิดว่ามันนับเป็นปัญหาที่เกิดขึ้นในบริบทของคำถามนี้ได้
Jon Skeet

@ JonSkeet ฉันกำลังตอบกลับผู้ช่วยแบบคงที่ซึ่งใช้ได้สำหรับประเภทดั้งเดิม แต่ไม่ใช่ประเภทอ้างอิง สถานการณ์ที่รายการเริ่มต้นด้วยรายการอ้างอิงเดียวกันดูเหมือนจะไม่ถูกต้อง ในสถานการณ์นั้นทำไมถึงมีรายการถ้าทุกรายการในนั้นชี้ไปที่วัตถุเดียวกันบนฮีป
Jeremy Ray Brown

สถานการณ์ตัวอย่าง: คุณต้องการเติมข้อมูลในรายการสตริงโดยเริ่มแรกด้วยรายการ "Unknown" สำหรับทุกองค์ประกอบจากนั้นคุณจะแก้ไขรายการสำหรับองค์ประกอบเฉพาะ ในกรณีนี้มีเหตุผลอย่างยิ่งที่ค่า "Unknown" ทั้งหมดจะอ้างอิงไปยังสตริงเดียวกัน การโคลนสตริงในแต่ละครั้งจะไม่มีจุดหมาย การเติมสตริงที่มีการอ้างอิงหลายรายการไปยังวัตถุเดียวกันไม่ใช่ "ถูก" หรือ "ผิด" ในความหมายทั่วไป ตราบใดที่ผู้อ่านรู้ว่าพฤติกรรมคืออะไรก็ขึ้นอยู่กับพวกเขาที่จะตัดสินใจว่าตรงตามกรณีการใช้งานเฉพาะหรือไม่
Jon Skeet

0

ประกาศเกี่ยวกับ IList: MSDN IList หมายเหตุ : "การใช้งาน IList แบ่งออกเป็น 3 ประเภท ได้แก่ อ่านอย่างเดียวขนาดคงที่และขนาดตัวแปร (... ) สำหรับเวอร์ชันทั่วไปของอินเทอร์เฟซนี้โปรดดู System.Collections.Generic.IList<T>"

IList<T>ไม่สืบทอดจากIList(แต่List<T>ใช้ทั้งสองIList<T>และIList) แต่เป็นตัวแปรขนาดเสมอ ตั้งแต่. NET 4.5 เราก็มีIReadOnlyList<T>แต่ AFAIK ไม่มีรายการทั่วไปขนาดคงที่ซึ่งจะเป็นสิ่งที่คุณกำลังมองหา


0

นี่คือตัวอย่างที่ฉันใช้สำหรับการทดสอบหน่วยของฉัน ฉันสร้างรายการของคลาสออบเจ็กต์ จากนั้นฉันใช้ forloop เพื่อเพิ่มจำนวนวัตถุ 'X' ที่ฉันคาดหวังจากบริการ ด้วยวิธีนี้คุณสามารถเพิ่ม / เริ่มต้นรายการสำหรับขนาดใดก็ได้

public void TestMethod1()
    {
        var expected = new List<DotaViewer.Interface.DotaHero>();
        for (int i = 0; i < 22; i++)//You add empty initialization here
        {
            var temp = new DotaViewer.Interface.DotaHero();
            expected.Add(temp);
        }
        var nw = new DotaHeroCsvService();
        var items = nw.GetHero();

        CollectionAssert.AreEqual(expected,items);


    }

หวังว่าฉันจะช่วยพวกคุณได้


-1

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

1. - จัดสรร N - loop N ต้นทุน: 1 * จัดสรร (N) + N * loop_iteration

2. - จัดสรร N - จัดสรร N + loop () ต้นทุน: 2 * ปันส่วน (N) + N * loop_iteration

อย่างไรก็ตามการจัดสรรการวนซ้ำของ List อาจเร็วกว่าเนื่องจาก List เป็นคลาสในตัว แต่ C # ถูกรวบรวมโดย jit sooo ...

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