Konwersja System.Array na List


279

Ostatniej nocy śniło mi się, że następujące rzeczy są niemożliwe. Ale w tym samym śnie ktoś z SO powiedział mi inaczej. Dlatego chciałbym wiedzieć, czy jest to możliwe do konwersji System.ArraydoList

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

do

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

2
Poniższy link pokazuje, jak to działa w c # codegateway.com/2011/12/…

6
Musisz rzucić na Arrayto, co faktycznie jest, a int[]następnie możesz użyć ToList:((int[])ints).ToList();
Tim Schmelter

Odpowiedzi:


428

Oszczędź sobie bólu ...

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.

Może także ...

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

lub...

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

lub...

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

lub...

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

15
Uwaga dotycząca kompletności: druga metoda jest dostępna tylko w wersji C # 3.0+.
Jon Seigel

21
Ponieważ tablica int już się implementuje IEnumerable<int>, OfType<int>()nie jest wymagana. ints.ToList();wystarczy.
Heinzi

16
Do OfType potrzebujesz System.Linq
JasonPlutext

11
Żaden z tych przykładów nie odpowiada na rzeczywiste pytanie. Ale chyba przyjął odpowiedź, więc był szczęśliwy. Mimo to żaden z nich nie przekształca tablicy w listę. „Konwersja System.Array na List”. Należy dodać ten przykład dla kompletności IMO. (Będąc najlepszą odpowiedzią i wszystkim)
Søren Ullidtz

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

84

Istnieje również przeciążenie konstruktora dla List, które będzie działać ... Ale wydaje mi się, że wymagałoby to użycia silnej tablicy.

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

... dla klasy 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);

Pomiędzy tym podejściem a tym ToList(), które jest bardziej efektywne? Czy jest różnica?
Ben Sutton

1
Trudno powiedzieć bez znajomości rzeczywistego rozmiaru zestawu danych (List wewnętrznie korzysta z tablic, które muszą być w stanie się rozwijać. Tablice są niezmienne). Jeśli wiesz, że rozmiar listy z góry w ten sposób może nieznacznie poprawić wydajność… ale zysk będzie tak mały, że będziesz równie dobrze może użyć wersji, którą wolisz zachować.
Matthew Whited

3
Czy zauważyłeś, że ten wątek ma 6 lat? (A moja druga odpowiedź bezpośrednio dotyczy jego przykładu użycia Arrayzamiast int[].)
Matthew Whited,

66

Co ciekawe, nikt nie odpowiada na pytanie, OP nie używa silnie napisanego, int[]ale Array.

Musisz rzucić na Arrayto, co faktycznie jest, a int[]następnie możesz użyć ToList:

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

Zauważ, że Enumerable.ToListwywołuje konstruktor listy, który najpierw sprawdza, czy można rzutować argument ICollection<T>(który implementuje tablicę), a następnie użyje bardziej wydajnej ICollection<T>.CopyTometody zamiast wyliczenia sekwencji.


11
Dziękuję, Enum.GetValueszwraca tablicę, a to pomogło mi zrobić z niej listę.
Martin Braun

3
Wiem, że to stare, ale masz rację, pytanie brzmi: odpowiedź. W mojej sytuacji dynamiczny deserializator zwraca tablicę systemową, ponieważ musi ona być przygotowana na akceptację dowolnego rodzaju danych, aby nie można było wstępnie załadować listy przed uruchomieniem. Dziękuję
Frank Cedeno

27

Najprostsza metoda to:

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

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

lub

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

7
Trzeba using System.Linq;do ToList()do pracy.
Jarekczek

To nie działa dla Array. .Cast<>Najpierw musisz rzucić lub zadzwonić .
BlueRaja - Danny Pflughoeft

11

W przypadku, gdy chcesz zwrócić tablicę wyliczeń jako listę, możesz wykonać następujące czynności.

using System.Linq;

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

5

Możesz to zrobić w zasadzie:

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

to twoja tablica, a potem możesz wywołać nową listę w następujący sposób:

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

Możesz to zrobić również dla złożonych obiektów.


4

w vb.net po prostu zrób to

mylist.addrange(intsArray)

lub

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

2
o wiele lepsze niż użycie OfType <> (mój VS2010 nie zaakceptowałby żadnego OfType ...)
woohoo

3

Możesz po prostu spróbować użyć swojego kodu:

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;

Następnie możesz po prostu użyć anyVariable jako swojego kodu.


2

Wystarczy użyć istniejącej metody .. .ToList ();

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

KISS (UTRZYMUJ IT SIMPLE SIR)


0

Mam nadzieję, że to jest pomocne.

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

uzyskać wartość ciągu

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

uzyskać wartość całkowitą

        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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.