Перетворення System.Array в список


279

Минулої ночі мені снилося, що наступне неможливо. Але у цьому ж сні хтось із ТА сказав мені інакше. Тому я хотів би знати, чи можна це System.ArrayзробитиList

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
Нижче посилання показує, як це робиться в c # codegateway.com/2011/12/…

6
Ви повинні відзначити Arrayте, що воно є насправді, а int[]потім ви можете використовувати ToList:((int[])ints).ToList();
Tim Schmelter

Відповіді:


428

Збережіть собі біль ...

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.

Можна також просто ...

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

або ...

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

або ...

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

або ...

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

15
Примітка для повноти: 2-й метод доступний лише в C # 3.0+.
Джон Сейгель

21
Оскільки масив int вже реалізований IEnumerable<int>, то OfType<int>()значення не потрібно. ints.ToList();достатньо.
Хайнці

16
Для OfType потрібен System.Linq
JasonPlutext

11
Жоден із цих прикладів насправді не відповідає дійсному питанню. Але я думаю, що він прийняв відповідь, щоб він був задоволений. Тим не менш, жодна з них насправді не перетворює масив у список. "Перетворення System.Array в список". Слід додати цей приклад для повноти ІМО. (Будучи найкращою відповіддю і всім)
Søren Ullidtz

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

84

Існує також перевантаження конструктора для List, яка буде працювати ... Але я думаю, для цього був би потрібний сильний набраний масив.

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

... для класу 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);

Між таким підходом та тим, хто використовує ToList(), який є більш ефективним? Або є різниця?
Бен Саттон

1
Важко сказати, не знаючи реального розміру набору даних (Список внутрішньо використовує масиви, які повинні бути в змозі розширити. Масиви незмінні.) Якщо ви знаєте, що розмір списку наперед таким чином може трохи покращити продуктивність ... але виграш буде таким малим Ви також можете використовувати версію, яку Ви бажаєте підтримувати.
Метью Віт

3
Ви помітили, що цій нитці 6 років? (І моя друга відповідь безпосередньо стосується його прикладу використання Arrayзамість цього int[].)
Метью Уайді

66

Цікаво, що ніхто не відповідає на питання, що ОП використовує не сильно набраний, int[]а an Array.

Ви повинні подати те, Arrayщо воно є насправді, а int[]потім ви можете використовувати ToList:

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

Зауважте, що Enumerable.ToListвиклик конструктора списку, який спочатку перевіряє, чи можна аргументувати аргумент ICollection<T>(який реалізує масив), тоді він використовуватиме більш ефективний ICollection<T>.CopyToметод замість перерахування послідовності.


11
Дякую, Enum.GetValuesповертає масив, і це допомогло мені скласти список із нього.
Мартін Браун

3
Я знаю, що це по-старому, але ти маєш рацію, на це питання. У моїй ситуації динамічний десеріалізатор повертає системний масив, оскільки він повинен бути готовим приймати будь-який тип даних, щоб ви не могли попередньо завантажити список до часу виконання. Дякую
Франк Седено

27

Найпростіший метод:

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

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

або

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

7
Потрібно using System.Linq;для ToList()працювати.
Jarekczek

Це не працює Array. Вам потрібно кинути його або зателефонувати .Cast<>спочатку.
BlueRaja - Danny Pflughoeft

11

У випадку, якщо ви хочете повернути масив переліків як список, ви можете зробити наступне.

using System.Linq;

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

5

Ви можете зробити так, як це:

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

це ваш масив, і чим ви можете назвати свій новий список так:

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

Ви можете зробити це і для складного об'єкта.


4

у vb.net просто зроби це

mylist.addrange(intsArray)

або

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

2
набагато краще, ніж використовувати OfType <> (мій VS2010 не прийняв би нічого OfType ...)
woohoo

3

Ви можете просто спробувати його в коді:

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;

Тоді ви можете просто використовувати anyVariable як свій код.


2

Просто використовуйте існуючий метод .. .ToList ();

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

KISS (ЗБЕРІТЬ ПРОСТИЙ СПІР)


0

Я сподіваюся, що це корисно.

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

отримати рядкове значення

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

отримати ціле значення

        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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.