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<int>
,所以不需要OfType<int>()
。 ints.ToList();
就够了。
对于OfType,你需要System.Linq
这些例子都没有真正回答实际问题。但我猜他接受了答案,所以他很高兴。尽管如此,其中没有一个实际上将数组转换为列表。 “将 System.Array 转换为列表”。应该添加该示例以确保 IMO 的完整性。 (成为最佳答案)
Enum.GetValues(typeof(Enumtype)).Cast还有一个 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<T>
(数组实现),然后它将使用更有效的ICollection<T>.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<>
。
你测试过这个吗?【参考方案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