Преобразование System.Array в список


279

Прошлой ночью мне снился сон, что следующее было невозможно. Но в том же сне кто-то из SO сказал мне иначе. Поэтому я хотел бы знать, если это возможно преобразовать 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();
Тим Шмельтер

Ответы:


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
Ни один из этих примеров на самом деле не отвечает на реальный вопрос. Но я думаю, что он принял ответ, поэтому он был счастлив. Тем не менее, ни один из них не конвертирует массив в список. Msgstr "Преобразование System.Array в список". Следует добавить этот пример для полноты ИМО. (Быть лучшим ответом и все)
Сорен Уллидц

4
Enum.GetValues ​​(typeof (Enumtype)). Cast <itemtype> (). ToList ()
Phan Bc 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
Трудно сказать, не зная реального размера набора данных (в List используются массивы, которые должны быть в состоянии расширяться. Массивы являются неизменяемыми.) Если вы знаете, что размер List заранее, это может немного повысить производительность ... но выигрыш будет настолько мал, что вы может также использовать версию, которую вы предпочитаете поддерживать.
Мэтью Уайтед

3
Вы заметили, что этой теме 6 лет? (И мой второй ответ непосредственно касается его примера использования Arrayвместо int[].)
Мэтью Уитед

66

Интересно, что никто не отвечает на вопрос, OP не использует строго типизированный, int[]а 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()работы.
Ярекчек

Это не работает для Array. Вы должны разыграть его или позвонить .Cast<>первым.
BlueRaja - Дэнни Пфлюгофт

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

ПОЦЕЛУЙ (СОХРАНИТЕ ЭТО ПРОСТО, СЭР)


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.