การแปลงของ System.Array เป็น List


279

เมื่อคืนฉันฝันว่าสิ่งต่อไปนี้เป็นไปไม่ได้ แต่ในความฝันเดียวกันมีคนจาก SO บอกฉันเป็นอย่างอื่น ดังนั้นฉันอยากทราบว่าเป็นไปได้ไหมที่จะเปลี่ยนSystem.Arrayเป็นList

Array ints = Array.CreateInstance(typeof(int), 5);
ints.SetValue(10, 0);
ints.SetValue(20, 1);
ints.SetValue(10, 2);
ints.SetValue(34, 3);
ints.SetValue(113, 4);

ถึง

List<int> lst = ints.OfType<int>(); // not working

2
ลิงค์ด้านล่างแสดงวิธีการใน c # codegateway.com/2011/12/…

6
คุณต้องโยนArrayสิ่งที่มันเป็นจริงint[]แล้วคุณสามารถใช้ToList:((int[])ints).ToList();
Tim Schmelter

คำตอบ:


428

ช่วยตัวเองด้วยความเจ็บปวด ...

using System.Linq;

int[] ints = new [] { 10, 20, 10, 34, 113 };

List<int> lst = ints.OfType<int>().ToList(); // this isn't going to be fast.

ยังสามารถ ...

List<int> lst = new List<int> { 10, 20, 10, 34, 113 };

หรือ...

List<int> lst = new List<int>();
lst.Add(10);
lst.Add(20);
lst.Add(10);
lst.Add(34);
lst.Add(113);

หรือ...

List<int> lst = new List<int>(new int[] { 10, 20, 10, 34, 113 });

หรือ...

var lst = new List<int>();
lst.AddRange(new int[] { 10, 20, 10, 34, 113 });

15
หมายเหตุเพื่อความครบถ้วน: วิธีที่ 2 มีเฉพาะใน C # 3.0+ เท่านั้น
Jon Seigel

21
ตั้งแต่ int อาร์เรย์การดำเนินการอยู่แล้วIEnumerable<int>ที่OfType<int>()ไม่จำเป็นต้องใช้ ints.ToList();พอเพียง
Heinzi

16
สำหรับ OfType คุณต้องมี System.Linq
JasonPlutext

11
ไม่มีตัวอย่างเหล่านี้ตอบคำถามจริงได้จริง แต่ฉันคิดว่าเขายอมรับคำตอบดังนั้นเขาจึงมีความสุข ถึงกระนั้นก็ไม่ได้มีหนึ่งในเหล่านี้แปลง Array เป็นรายการ "การแปลงระบบให้เป็นรายการ" ควรเพิ่มตัวอย่างเพื่อความสมบูรณ์ของ IMO (เป็นคำตอบที่ดีที่สุดและทั้งหมด)
Søren Ullidtz

4
Enum.GetValues ​​(typeof (Enumtype)) Cast <itemtype> () .ToList ()
ฟานĐứcBình

84

นอกจากนี้ยังมี Constructor Overload สำหรับ List ที่จะใช้งานได้ ... แต่ฉันคิดว่านี่จะต้องใช้อาเรย์ที่แข็งแกร่ง

//public List(IEnumerable<T> collection)
var intArray = new[] { 1, 2, 3, 4, 5 };
var list = new List<int>(intArray);

... สำหรับคลาสอาเรย์

var intArray = Array.CreateInstance(typeof(int), 5);
for (int i = 0; i < 5; i++)
    intArray.SetValue(i, i);
var list = new List<int>((int[])intArray);

ระหว่างวิธีการนี้กับวิธีที่ใช้ToList()ซึ่งมีประสิทธิภาพมากกว่า หรือมีความแตกต่าง?
Ben Sutton

1
ยากที่จะพูดโดยไม่ทราบขนาดชุดข้อมูลจริง (รายการใช้อาร์เรย์ภายในที่ต้องสามารถขยายได้อาร์เรย์นั้นไม่เปลี่ยนรูป) หากคุณรู้ว่าขนาดรายการตรงไปตรงมาด้วยวิธีนี้สามารถปรับปรุงประสิทธิภาพได้เล็กน้อย ... แต่กำไรจะน้อย อาจใช้เวอร์ชันที่คุณต้องการบำรุงรักษาด้วยเช่นกัน
Matthew Whited

3
คุณสังเกตเห็นไหมว่าหัวข้อนี้มีอายุ 6 ปี? (และคำตอบที่สองของฉันจัดการกับตัวอย่างการใช้งานArrayของint[]เขาโดยตรง)
Matthew Whited

66

ที่น่าสนใจไม่มีใครตอบคำถาม OP ไม่ได้ใช้พิมพ์ขอแต่int[]Array

คุณต้องโยนArrayสิ่งที่มันเป็นจริงint[]และจากนั้นคุณสามารถใช้ToList:

List<int> intList = ((int[])ints).ToList();

โปรดทราบว่าการEnumerable.ToListเรียกตัวสร้างรายการที่ตรวจสอบก่อนว่าอาร์กิวเมนต์สามารถถูกส่งไปยังICollection<T>(ซึ่งอาร์เรย์ใช้) แล้วมันจะใช้ICollection<T>.CopyToวิธีการที่มีประสิทธิภาพมากขึ้นแทนการแจกแจงลำดับ


11
ขอบคุณEnum.GetValuesส่งคืน Array และสิ่งนี้ช่วยฉันในการสร้างรายการจากมัน
Martin Braun

3
ฉันรู้ว่านี่เก่า แต่คุณพูดถูกคำถามนี้ตอบ ในสถานการณ์ของฉัน Dynamic deserializer จะคืนค่าอาร์เรย์ของระบบเพราะต้องพร้อมที่จะรับชนิดข้อมูลใด ๆ เพื่อที่คุณจะไม่สามารถโหลดรายการล่วงหน้าได้จนกว่ารันไทม์ ขอบคุณ
Frank Cedeno

27

วิธีที่ง่ายที่สุดคือ:

int[] ints = new [] { 10, 20, 10, 34, 113 };

List<int> lst = ints.ToList();

หรือ

List<int> lst = new List<int>();
lst.AddRange(ints);

7
หนึ่งต้องusing System.Linq;สำหรับToList()การทำงาน
Jarekczek

Arrayนี้ไม่ได้ทำงานให้กับ คุณต้องโยนมันหรือโทร.Cast<>ก่อน
BlueRaja - Danny Pflughoeft

11

ในกรณีที่คุณต้องการคืนค่าอาร์เรย์ของ enums เป็นรายการคุณสามารถทำสิ่งต่อไปนี้

using System.Linq;

public List<DayOfWeek> DaysOfWeek
{
  get
  {
    return Enum.GetValues(typeof(DayOfWeek))
               .OfType<DayOfWeek>()
               .ToList();
  }
}

5

คุณสามารถทำสิ่งนี้โดยพื้นฐาน:

int[] ints = new[] { 10, 20, 10, 34, 113 };

นี่คืออาร์เรย์ของคุณและคุณสามารถเรียกรายการใหม่ของคุณได้ดังนี้:

 var newList = new List<int>(ints);

คุณสามารถทำสิ่งนี้กับวัตถุที่ซับซ้อนได้เช่นกัน


4

ใน vb.net เพียงแค่ทำสิ่งนี้

mylist.addrange(intsArray)

หรือ

Dim mylist As New List(Of Integer)(intsArray)

2
ดีกว่าการใช้ OfType <> (VS2010 ของฉันจะไม่ยอมรับ OfType ใด ๆ ... )
woohoo

3

คุณสามารถลองโค้ดของคุณ:

Array ints = Array.CreateInstance(typeof(int), 5);
ints.SetValue(10, 0);

ints.SetValue(20, 1);
ints.SetValue(10, 2);
ints.SetValue(34, 3);
ints.SetValue(113, 4);

int[] anyVariable=(int[])ints;

จากนั้นคุณสามารถใช้ anyVariable เป็นรหัสของคุณ


2

เพียงใช้วิธีที่มีอยู่ .. .ToList ();

   List<int> listArray = array.ToList();

KISS (ให้มันง่าย ๆ เซอร์)


0

ฉันหวังว่านี้จะเป็นประโยชน์.

enum TESTENUM
    {
        T1 = 0,
        T2 = 1,
        T3 = 2,
        T4 = 3
    }

รับค่าสตริง

string enumValueString = "T1";

        List<string> stringValueList =  typeof(TESTENUM).GetEnumValues().Cast<object>().Select(m => 
            Convert.ToString(m)
            ).ToList();

        if(!stringValueList.Exists(m => m == enumValueString))
        {
            throw new Exception("cannot find type");
        }

        TESTENUM testEnumValueConvertString;
        Enum.TryParse<TESTENUM>(enumValueString, out testEnumValueConvertString);

รับค่าจำนวนเต็ม

        int enumValueInt = 1;

        List<int> enumValueIntList =  typeof(TESTENUM).GetEnumValues().Cast<object>().Select(m =>
            Convert.ToInt32(m)
            ).ToList();

        if(!enumValueIntList.Exists(m => m == enumValueInt))
        {
            throw new Exception("cannot find type");
        }

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