Conversion de System.Array en liste


279

Hier soir, j'avais rêvé que ce qui suit était impossible. Mais dans le même rêve, quelqu'un de SO m'a dit le contraire. Je voudrais donc savoir s’il est possible de convertir System.ArrayenList

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
Le lien ci-dessous montre comment il fonctionne dans c # codegateway.com/2011/12/…

6
Vous devez lancer le Arrayvers ce qu'il est réellement, un int[], alors vous pouvez utiliser ToList:((int[])ints).ToList();
Tim Schmelter

Réponses:


428

Épargnez-vous de la douleur ...

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.

Peut aussi simplement ...

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

ou...

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

ou...

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

ou...

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

15
Remarque pour l'exhaustivité: la 2ème méthode n'est disponible qu'en C # 3.0+.
Jon Seigel

21
Étant donné que le tableau int implémente déjà IEnumerable<int>, le OfType<int>()n'est pas requis. ints.ToList();suffit.
Heinzi

16
Pour OfType, vous avez besoin de System.Linq
JasonPlutext

11
Aucun de ces exemples ne répond réellement à la question réelle. Mais je suppose qu'il a accepté la réponse alors il était heureux. Pourtant, aucun d'entre eux ne convertit réellement un tableau en liste. "Conversion de System.Array en liste". Devrait ajouter cet exemple pour l'exhaustivité OMI. (Être la meilleure réponse et tout)
Søren Ullidtz

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

84

Il existe également une surcharge de constructeur pour List qui fonctionnera ... Mais je suppose que cela nécessiterait un tableau typé fort.

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

... pour la classe 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);

Entre cette approche et celle qui l'utilise ToList(), quelle est la plus efficace? Ou y a-t-il une différence?
Ben Sutton

1
Difficile à dire sans connaître la taille réelle de l'ensemble de données (List utilise en interne des tableaux qui doivent pouvoir s'étendre. Les tableaux sont immuables.) Si vous connaissez la taille de liste à l'avance de cette façon, cela pourrait améliorer légèrement les performances ... mais le gain va être si petit que vous peut également utiliser la version que vous préférez conserver.
Matthew Whited

3
Avez-vous remarqué que ce fil a 6 ans? (Et ma deuxième réponse gère directement son exemple d'utilisation Arrayau lieu de int[].)
Matthew Whited

66

Fait intéressant, personne ne répond à la question, OP n'utilise pas un caractère fortement typé int[]mais un Array.

Vous devez lancer le Arrayvers ce qu'il est réellement, un int[], alors vous pouvez utiliser ToList:

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

Notez que Enumerable.ToListappelle le constructeur de liste qui vérifie d'abord si l'argument peut être converti ICollection<T>(dans lequel un tableau implémente), puis il utilisera la ICollection<T>.CopyTométhode la plus efficace au lieu d'énumérer la séquence.


11
Merci, Enum.GetValuesrenvoie un tableau et cela m'a aidé à en faire une liste.
Martin Braun

3
Je sais que c'est vieux mais vous avez raison, la question est la réponse par cela. Dans ma situation, un désérialiseur dynamique renvoie un tableau système, car il doit être prêt à accepter tout type de données afin que vous ne puissiez pas précharger la liste avant l'exécution. Merci
Frank Cedeno

27

La méthode la plus simple est:

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

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

ou

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

7
Il faut using System.Linq;pour ToList()travailler.
Jarekczek

Ça ne marche pas Array. Vous devez le lancer ou appeler en .Cast<>premier.
BlueRaja - Danny Pflughoeft

11

Dans le cas où vous souhaitez renvoyer un tableau d'énumérations sous forme de liste, vous pouvez effectuer les opérations suivantes.

using System.Linq;

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

5

Vous pouvez faire comme ça essentiellement:

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

c'est votre tableau, et que vous pouvez appeler votre nouvelle liste comme ceci:

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

Vous pouvez également le faire pour un objet complexe.


4

dans vb.net il suffit de faire cela

mylist.addrange(intsArray)

ou

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

2
beaucoup mieux que d'utiliser OfType <> (mon VS2010 n'accepterait rien OfType ...)
woohoo

3

Vous pouvez simplement essayer votre code:

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;

Ensuite, vous pouvez simplement utiliser anyVariable comme code.


2

Utilisez simplement la méthode existante .. .ToList ();

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

BAISER (GARDER SIMPLE SIR)


0

J'espère que ceci est utile.

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

obtenir une valeur de chaîne

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

obtenir une valeur entière

        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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.