Konversi Sistem. Array ke Daftar


279

Tadi malam saya bermimpi bahwa yang berikut ini tidak mungkin. Tetapi dalam mimpi yang sama, seseorang dari SO mengatakan sebaliknya. Oleh karena itu saya ingin tahu apakah itu mungkin untuk mengkonversi System.ArraykeList

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

untuk

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

2
Tautan di bawah ini menunjukkan caranya di c # codegateway.com/2011/12/…

6
Anda harus melemparkan Arrayke apa itu sebenarnya, dan int[], maka Anda dapat menggunakan ToList:((int[])ints).ToList();
Tim Schmelter

Jawaban:


428

Selamatkan dirimu dari rasa sakit ...

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.

Bisa juga hanya ...

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

atau...

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

atau...

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

atau...

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

15
Catatan untuk kelengkapan: metode ke-2 hanya tersedia di C # 3.0+.
Jon Seigel

21
Karena array int sudah mengimplementasikan IEnumerable<int>, maka OfType<int>()tidak diperlukan. ints.ToList();cukup.
Heinzi

16
Untuk OfType, Anda perlu System.Linq
JasonPlutext

11
Tidak satu pun dari contoh-contoh ini yang benar-benar menjawab pertanyaan aktual. Tapi kurasa dia menerima jawabannya jadi dia senang. Namun, tidak satu pun dari ini yang benar-benar mengkonversi Array ke Daftar. "Konversi Sistem. Array ke Daftar". Harus menambahkan contoh itu untuk kelengkapan IMO. (Menjadi jawaban teratas dan semuanya)
Søren Ullidtz

4
Enum.GetValues ​​(typeof (Enumtype)). Cast <itemtype> () .ToList ()
Phan Đức Bình

84

Ada juga konstruktor kelebihan untuk Daftar yang akan berfungsi ... Tapi saya kira ini akan membutuhkan array yang diketik kuat.

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

... untuk kelas Array

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

Antara pendekatan ini dan yang menggunakan ToList(), mana yang lebih efisien? Atau ada perbedaan?
Ben Sutton

1
Sulit untuk mengatakan tanpa mengetahui ukuran dataset nyata (Daftar internal menggunakan array yang harus dapat berkembang. Array tidak dapat diubah.) Jika Anda tahu ukuran Daftar dimuka cara ini dapat meningkatkan kinerja sedikit ... tetapi keuntungan akan menjadi sangat kecil Anda mungkin juga menggunakan versi yang Anda inginkan untuk dipertahankan.
Matthew Whited

3
Pernahkah Anda memperhatikan bahwa utas ini berumur 6 tahun? (Dan jawaban kedua saya langsung menangani contohnya menggunakan Arrayalih-alih int[].)
Matthew Whited

66

Menariknya tidak ada yang menjawab pertanyaan, OP tidak menggunakan yang diketik int[]tetapi Array.

Anda harus menggunakan Arrayapa yang sebenarnya, dan int[]Anda dapat menggunakan ToList:

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

Perhatikan bahwa Enumerable.ToListpanggilan daftar konstruktor bahwa cek pertama jika argumen dapat dicor ke ICollection<T>(yang merupakan alat array), maka akan menggunakan lebih efisien ICollection<T>.CopyTometode bukannya enumerasi urutan.


11
Terima kasih, Enum.GetValuesmengembalikan Array dan ini membantu saya membuat daftar darinya.
Martin Braun

3
Saya tahu ini sudah tua tetapi Anda benar, pertanyaannya adalah jawabannya. Dalam situasi saya, deserializer dinamis mengembalikan array sistem karena harus dipersiapkan untuk menerima segala jenis data sehingga Anda tidak dapat melakukan pramuat daftar hingga runtime. Terima kasih
Frank Cedeno

27

Metode paling sederhana adalah:

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

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

atau

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

7
Salah satu kebutuhan using System.Linq;untuk ToList()bekerja.
Jarekczek

Ini tidak berhasil Array. Anda harus melemparkannya atau menelepon .Cast<>dulu.
BlueRaja - Danny Pflughoeft

11

Jika Anda ingin mengembalikan array enum sebagai daftar, Anda dapat melakukan hal berikut.

using System.Linq;

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

5

Anda dapat melakukannya seperti ini pada dasarnya:

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

ini array Anda, dan Anda dapat memanggil daftar baru Anda seperti ini:

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

Anda dapat melakukan ini untuk objek yang kompleks juga.


4

di vb.net lakukan saja ini

mylist.addrange(intsArray)

atau

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

2
jauh lebih baik daripada menggunakan OfType <> (VS2010 saya tidak akan menerima apapun OfType ...)
woohoo

3

Anda bisa mencobanya saja ke kode Anda:

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;

Kemudian Anda bisa menggunakan anyVariable sebagai kode Anda.


2

Cukup gunakan metode yang ada .. .ToList ();

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

KISS (TETAP SIR SEDERHANA)


0

Saya harap ini bermanfaat.

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

dapatkan nilai string

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

dapatkan nilai integer

        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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.