System.Array到列表的转换


279

昨晚我梦到以下事情是不可能的。但是在同一个梦中,SO的某人告诉我否则。因此,我想知道是否有可能转换System.ArrayList

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

6
您必须将其Array转换为实际的值,int[]然后可以使用ToList((int[])ints).ToList();
Tim Schmelter 2015年

Answers:


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
完整性说明:第二种方法仅在C#3.0+中可用。
乔恩·塞格尔

21
由于int数组已经实现IEnumerable<int>,因此OfType<int>()不需要。ints.ToList();足够了。
海因兹

16
对于
OfType

11
这些示例均未真正回答实际问题。但是我想他接受了答案,所以很高兴。尽管如此,这些方法中没有一个实际上将Array转换为List。“将System.Array转换为列表”。为了完整性,应添加该示例。(最重要的答案)
索伦·乌利兹(SørenUllidtz

4
。Enum.GetValues(typeof运算(Enumtype))演员<项目类型>()ToList()。
藩Đức平

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[]。)
Matthew Whited

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()工作。
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

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用作代码。



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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.