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.