วิธีการคัดลอกส่วนของอาเรย์ไปยังอาเรย์อื่นใน C #?


144

ฉันจะคัดลอกส่วนหนึ่งของอาร์เรย์ไปยังอาร์เรย์อื่นได้อย่างไร

คิดว่าฉันมี

int[] a = {1,2,3,4,5};

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

เช่นถ้าฉันให้ดัชนีเริ่มต้นเป็น 1 และดัชนีสิ้นสุดเป็น 3 องค์ประกอบ 2, 3, 4 ควรได้รับการคัดลอกในอาร์เรย์ใหม่

คำตอบ:


273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • a = อาร์เรย์ต้นทาง
  • 1 = ดัชนีเริ่มต้นในอาร์เรย์ที่มา
  • b = อาร์เรย์ปลายทาง
  • 0 = ดัชนีเริ่มต้นในอาร์เรย์ปลายทาง
  • 3 = องค์ประกอบที่ต้องการคัดลอก

7
ด้วยพารามิเตอร์ที่มีชื่อซึ่งมีให้ใช้งานในตอนนี้คุณไม่จำเป็นต้องจัดทำเอกสารพารามิเตอร์ 5 ตัวใด ๆ
Hamish Grubijan

11
@ หนามดีบางที โดยส่วนตัวฉันจะไม่เพิ่มชื่อที่ชัดเจนเว้นแต่จะทำให้รหัสชัดเจนมากขึ้นและฉันไม่แน่ใจ (ในกรณีนี้) ว่าชื่อพารามิเตอร์ด้วยตัวเองจะประสบความสำเร็จ
Marc Gravell

19

ดูคำถามนี้ LINQ Take () และข้าม () เป็นคำตอบที่ได้รับความนิยมมากที่สุดเช่นเดียวกับ Array.CopyTo ()

ต้นฉบับได้เร็วขึ้นวิธีขยายอธิบายไว้ที่นี่


1
อีกคำถามเกี่ยวกับ SO พร้อมคำตอบที่เหมาะสม: stackoverflow.com/a/3539065/411428
Manfred

2
โปรดทราบว่า LINQ ไม่เหมาะเมื่อต้องรับมือกับสถานการณ์ที่มีความสำคัญต่อประสิทธิภาพ
XD เผชิญกับฉันเมื่อ

3
int[] a = {1,2,3,4,5};

int [] b= new int[a.length]; //New Array and the size of a which is 4

Array.Copy(a,b,a.length);

โดยที่ Array คือคลาสที่มีเมธอด Copy ซึ่งคัดลอกองค์ประกอบของอาร์เรย์ไปยังอาร์เรย์ b

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


1

หมายเหตุ: ฉันพบคำถามนี้เพื่อค้นหาหนึ่งในขั้นตอนในคำตอบของวิธีการปรับขนาดอาร์เรย์ที่มีอยู่

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

สำหรับใครที่พบคำถามนี้ที่กำลังมองหาสิ่งเดียวกันกับฉันมันง่ายมาก:

Array.Resize<T>(ref arrayVariable, newSize);

โดยที่Tคือประเภทคือที่ประกาศ arrayVariable:

T[] arrayVariable;

วิธีการดังกล่าวจะจัดการกับการตรวจสอบที่เป็นโมฆะรวมถึง newSize == oldSize ที่ไม่มีผลกระทบและแน่นอนว่าจะจัดการกับกรณีและปัญหาโดยที่หนึ่งในอาร์เรย์มีความยาวมากกว่าอีกแบบหนึ่ง

ดูบทความ MSDNสำหรับข้อมูลเพิ่มเติม


0

ในกรณีที่คุณต้องการใช้วิธีArray.Copyของคุณเอง

วิธีการคงที่ซึ่งเป็นประเภททั่วไป

 static void MyCopy<T>(T[] sourceArray, long sourceIndex, T[] destinationArray, long destinationIndex, long copyNoOfElements)
 {
  long totaltraversal = sourceIndex + copyNoOfElements;
  long sourceArrayLength = sourceArray.Length;

  //to check all array's length and its indices properties before copying
  CheckBoundaries(sourceArray, sourceIndex, destinationArray, copyNoOfElements, sourceArrayLength);
   for (long i = sourceIndex; i < totaltraversal; i++)
     {
      destinationArray[destinationIndex++] = sourceArray[i]; 
     } 
  }

การใช้วิธีขอบเขต

private static void CheckBoundaries<T>(T[] sourceArray, long sourceIndex, T[] destinationArray, long copyNoOfElements, long sourceArrayLength)
        {
            if (sourceIndex >= sourceArray.Length)
            {
                throw new IndexOutOfRangeException();
            }
            if (copyNoOfElements > sourceArrayLength)
            {
                throw new IndexOutOfRangeException();
            }
            if (destinationArray.Length < copyNoOfElements)
            {
                throw new IndexOutOfRangeException();
            }
        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.