将System.Array转换为List

use*_*276 256 c#

昨晚我梦见以下是不可能的.但是在同一个梦里,来自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);
Run Code Online (Sandbox Code Playgroud)

List<int> lst = ints.OfType<int>(); // not working
Run Code Online (Sandbox Code Playgroud)

Dav*_*ave 393

为自己省点痛苦......

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.
Run Code Online (Sandbox Code Playgroud)

也可以......

List<int> lst = new List<int> { 10, 20, 10, 34, 113 };
Run Code Online (Sandbox Code Playgroud)

要么...

List<int> lst = new List<int>();
lst.Add(10);
lst.Add(20);
lst.Add(10);
lst.Add(34);
lst.Add(113);
Run Code Online (Sandbox Code Playgroud)

要么...

List<int> lst = new List<int>(new int[] { 10, 20, 10, 34, 113 });
Run Code Online (Sandbox Code Playgroud)

要么...

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

  • 由于int数组已经实现了`IEnumerable <int>`,因此不需要`OfType <int>()`.`ints.ToList();`就够了. (17认同)
  • 对于OfType,您需要System.Linq (16认同)
  • 注意完整性:第二种方法仅适用于C#3.0+. (15认同)
  • 这些例子都没有真正回答实际问题.但我猜他接受了答案,所以他很高兴.但是,其中没有一个实际上将Array转换为List."将System.Array转换为List".应该为完整性IMO添加该示例.(最佳答案和所有) (8认同)
  • Enum.GetValues(typeof(Enumtype))。Cast &lt;项目类型&gt;()。ToList() (3认同)
  • @kenny做了一些调整,这里的第一种方法绝对不是最快的方法. (2认同)
  • @Dave确实,OfType 适用于 Array 类,只是在示例中没有使用 Array 类。从第二条评论来看,我并不是唯一对此感到困惑的人。 (2认同)
  • 不回答问题。 (2认同)

Mat*_*ted 77

List也有一个构造函数重载可以工作......但我想这需要一个强类型数组.

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

...对于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);
Run Code Online (Sandbox Code Playgroud)

  • 你注意到这个帖子已经6岁了吗?(我的第二个答案直接处理他使用`Array`而不是`int []`的例子.) (2认同)

Tim*_*ter 56

有趣的是,没有人回答这个问题,OP不是使用强类型int[]而是使用Array.

你必须将其Array转换为实际的内容int[],然后你可以使用ToList:

List<int> intList = ((int[])ints).ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,Enumerable.ToList调用列表构造函数首先检查参数是否可以转换为ICollection<T>(数组实现的),然后它将使用更有效的ICollection<T>.CopyTo方法而不是枚举序列.

  • 谢谢你,'Enum.GetValues`返回一个数组,这帮助我制作了一个列表. (9认同)
  • 我知道这是旧的,但你是对的,问题就是答案.在我的情况下,动态反序列化器返回一个系统数组,因为它必须准备接受任何类型的数据类型,因此你不能在运行时预加载列表.谢谢 (3认同)

小智 27

最简单的方法是:

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

List<int> lst = ints.ToList();
Run Code Online (Sandbox Code Playgroud)

要么

List<int> lst = new List<int>();
lst.AddRange(ints);
Run Code Online (Sandbox Code Playgroud)

  • 需要`使用System.Linq;`来使`ToList()`起作用. (6认同)
  • 这不适用于“数组”。您需要先对其进行强制转换或调用`.Cast&lt;&gt;`。 (2认同)

小智 7

如果要将枚举数组作为列表返回,可以执行以下操作.

using System.Linq;

public List<DayOfWeek> DaysOfWeek
{
  get
  {
    return Enum.GetValues(typeof(DayOfWeek))
               .OfType<DayOfWeek>()
               .ToList();
  }
}
Run Code Online (Sandbox Code Playgroud)


Smi*_*ith 5

在vb.net中只需这样做

mylist.addrange(intsArray)
Run Code Online (Sandbox Code Playgroud)

或者

Dim mylist As New List(Of Integer)(intsArray)
Run Code Online (Sandbox Code Playgroud)

  • 比使用 OfType&lt;&gt; 好得多(我的 VS2010 不会接受任何 OfType...) (2认同)

nzr*_*tmn 5

你基本上可以这样做:

int[] ints = new[] { 10, 20, 10, 34, 113 };
Run Code Online (Sandbox Code Playgroud)

这是你的数组,然后你可以像这样调用你的新列表:

 var newList = new List<int>(ints);
Run Code Online (Sandbox Code Playgroud)

您也可以对复杂对象执行此操作。