System.Array 到 List 的转换

Posted

技术标签:

【中文标题】System.Array 到 List 的转换【英文标题】:Conversion of System.Array to List 【发布时间】:2010-12-08 20:36:15 【问题描述】:

昨晚我梦见以下事情是不可能的。但在同一个梦里,来自 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

【问题讨论】:

下面的链接展示了它在c#中的作用codegateway.com/2011/12/… 您必须将Array 转换为实际的int[],然后您可以使用ToList((int[])ints).ToList(); @naserasadi 请考虑接受 Tim Schmelter 的答案,因为这似乎是您问题的正确答案,甚至 12 年后,该问题仍显示在搜索结果的顶部。谢谢! 【参考方案1】:

为自己省点痛苦……

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

【讨论】:

完整性注意:第二种方法仅在 C# 3.0+ 中可用。 由于 int 数组已经实现了IEnumerable&lt;int&gt;,所以不需要OfType&lt;int&gt;()ints.ToList(); 就够了。 对于OfType,你需要System.Linq 这些例子都没有真正回答实际问题。但我猜他接受了答案,所以他很高兴。尽管如此,其中没有一个实际上将数组转换为列表。 “将 System.Array 转换为列表”。应该添加该示例以确保 IMO 的完整性。 (成为最佳答案) Enum.GetValues(typeof(Enumtype)).Cast().ToList()【参考方案2】:

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

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

...对于数组类

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()的方法之间,哪个更有效?还是有区别? 如果不知道真正的数据集大小很难说(List 内部使用必须能够扩展的数组。数组是不可变的。)如果您预先知道 List 大小,这种方式可以稍微提高性能……但是增益将是如此之小,您不妨使用您喜欢维护的版本。 你注意到这个帖子有 6 年历史了吗? (我的第二个答案直接处理了他使用Array 而不是int[] 的例子。)【参考方案3】:

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

您必须将Array 转换为实际的int[],然后您可以使用ToList

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

请注意Enumerable.ToList 调用list constructor,它首先检查参数是否可以强制转换为ICollection&lt;T&gt;(数组实现),然后它将使用更有效的ICollection&lt;T&gt;.CopyTo method 而不是枚举序列。

【讨论】:

谢谢,Enum.GetValues 返回一个数组,这帮助我从中列出了一个列表。 我知道这是旧的,但你是对的,问题就是这个答案。在我的情况下,动态反序列化器返回一个系统数组,因为它必须准备好接受任何类型的数据类型,因此您无法在运行时预加载列表。谢谢【参考方案4】:

最简单的方法是:

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

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

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

【讨论】:

需要using System.Linq; 才能使ToList() 工作。 这不适用于Array。您需要先投射或致电.Cast&lt;&gt; 你测试过这个吗?【参考方案5】:

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

using System.Linq;

public List<DayOfWeek> DaysOfWeek

  get
  
    return Enum.GetValues(typeof(DayOfWeek))
               .OfType<DayOfWeek>()
               .ToList();
  

【讨论】:

【参考方案6】:

在 vb.net 中这样做

mylist.addrange(intsArray)

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

【讨论】:

比使用 OfType 好多了(我的 VS2010 不接受任何 OfType...)【参考方案7】:

你基本上可以这样做:

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

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

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

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

【讨论】:

【参考方案8】:

你可以试试你的代码:

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 作为你的代码。

【讨论】:

【参考方案9】:

只使用现有的方法..ToList();

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

亲吻(保持简单,先生)

【讨论】:

【参考方案10】:

我知道两种方法:

List<int> myList1 = new List<int>(myArray);

或者,

List<int> myList2 = myArray.ToList();

我假设您了解数据类型,并且会根据需要更改类型。

【讨论】:

这似乎只是对现有答案的重复。【参考方案11】:

我希望这会有所帮助。

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

【讨论】:

以上是关于System.Array 到 List 的转换的主要内容,如果未能解决你的问题,请参考以下文章

powershell 将 system.array 转换为数据表

如何在 system.array - C# 中保留 null?

2022-04-26:给定四个整数 sx , sy ,tx 和 ty,如果通过一系列的转换可以从起点 (sx, sy) 到达终点 (tx, ty),则返回 true,否则返回 false。 从点 (x

数据结构与算法之深入解析“到达终点”的求解思路与算法示例

Powershell System.Array 到 CSV 文件

利用反向推理来解决“到达终点”问题