Konvertierung von System.Array in List


278

Letzte Nacht hatte ich geträumt, dass das Folgende unmöglich ist. Aber im selben Traum sagte mir jemand von SO etwas anderes. Daher würde ich gerne wissen, ob es es möglich , zu konvertieren System.ArrayzuList

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

zu

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

2
Der folgende Link zeigt, wie es in c # codegateway.com/2011/12/… funktioniert

6
Sie müssen das so umwandeln Array, wie es tatsächlich ist, int[]und dann können Sie Folgendes verwenden ToList:((int[])ints).ToList();
Tim Schmelter

Antworten:


427

Sparen Sie sich Schmerzen ...

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.

Kann auch nur ...

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

oder...

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

oder...

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

oder...

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

15
Hinweis zur Vollständigkeit: Die 2. Methode ist nur in C # 3.0+ verfügbar.
Jon Seigel

21
Da das int-Array bereits implementiert ist IEnumerable<int>, OfType<int>()ist das nicht erforderlich. ints.ToList();genügt.
Heinzi

16
Für OfType benötigen Sie System.Linq
JasonPlutext

10
Keines dieser Beispiele beantwortet tatsächlich die eigentliche Frage. Aber ich denke, er hat die Antwort akzeptiert, also war er glücklich. Dennoch konvertiert keiner von diesen tatsächlich ein Array in eine Liste. "Konvertierung von System.Array in List". Sollte dieses Beispiel der Vollständigkeit halber IMO hinzufügen. (Top Antwort und alles)
Søren Ullidtz

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

84

Es gibt auch eine Konstruktorüberladung für List, die funktionieren wird ... Aber ich denke, dies würde ein stark typisiertes Array erfordern.

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

... für die Array-Klasse

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

Was ist zwischen diesem und dem verwendeten Ansatz ToList()effizienter? Oder gibt es einen Unterschied?
Ben Sutton

1
Schwer zu sagen, ohne die tatsächliche Größe des Datensatzes zu kennen (List verwendet intern Arrays, die erweitert werden können müssen. Arrays sind unveränderlich.) Wenn Sie die Größe der Liste im Voraus kennen, kann dies die Leistung geringfügig verbessern… aber der Gewinn wird so gering sein, dass Sie Sie können auch die Version verwenden, die Sie bevorzugen.
Matthew Whited

3
Haben Sie bemerkt, dass dieser Thread 6 Jahre alt ist? (Und meine zweite Antwort behandelt direkt sein Beispiel der Verwendung Arrayanstelle von int[].)
Matthew Whited

66

Interessanterweise beantwortet niemand die Frage, OP verwendet kein stark typisiertes, int[]sondern ein Array.

Sie müssen das so umwandeln Array, wie es tatsächlich ist, int[]und dann können Sie Folgendes verwenden ToList:

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

Beachten Sie, dass Enumerable.ToListder Listenkonstruktor aufgerufen wird , der zuerst prüft, ob das Argument umgewandelt werden kann ICollection<T>(was ein Array implementiert), und dann die effizientere ICollection<T>.CopyToMethode verwendet, anstatt die Sequenz aufzulisten.


11
Vielen Dank, Enum.GetValuesgibt ein Array zurück und dies hat mir geholfen, eine Liste daraus zu erstellen.
Martin Braun

3
Ich weiß, das ist alt, aber Sie haben Recht, die Frage ist die Antwort darauf. In meiner Situation gibt ein dynamischer Deserializer ein Systemarray zurück, da es darauf vorbereitet sein muss, jeden Datentyp zu akzeptieren, damit Sie die Liste erst zur Laufzeit vorladen können. Vielen Dank
Frank Cedeno

27

Die einfachste Methode ist:

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

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

oder

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

7
Man muss using System.Linq;für ToList()an der Arbeit.
Jarekczek

10

Wenn Sie ein Array von Aufzählungen als Liste zurückgeben möchten, können Sie Folgendes tun.

using System.Linq;

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

5

Sie können dies grundsätzlich so machen:

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

Dies ist Ihr Array, und dann können Sie Ihre neue Liste folgendermaßen aufrufen:

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

Sie können dies auch für komplexe Objekte tun.


4

in vb.net mach das einfach

mylist.addrange(intsArray)

oder

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

2
viel besser als mit OfType <> (mein VS2010 würde nichts OfType akzeptieren ...)
woohoo

3

Sie können es einfach mit Ihrem Code versuchen:

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;

Dann können Sie einfach die anyVariable als Code verwenden.


2

Verwenden Sie einfach die vorhandene Methode .. .ToList ();

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

KUSS (BEHALTEN SIE ES EINFACH SIR)


0

Ich hoffe das ist hilfreich.

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

String-Wert abrufen

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

Ganzzahligen Wert abrufen

        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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.