将文本文件转换为列表<int>

问题描述 投票:0回答:2

我有一个包含 ID 号的 CSV 文件,我需要将其作为

IEnumerable<int>
。我试图尽可能简单地从 A 到达 B,并提出了以下想法:

Global.migrated = File.ReadAllText(Global.migrationList).Split(',').Cast<int>().ToList<int>();

但是,当我运行此命令时,我被告知 Cast 无效。我还尝试读取字符串列表并转换为 int:

List<string> myTemp = File.ReadAllText(Global.migrationList).Split(',').ToList<string>();
Global.migrated = myTemp.Cast<int>();

但这会引发以下错误:

无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.List”。存在显式转换。缺演员吗?

我不明白。在这种情况下,我尝试投射的对象不是

IEnumerable<int>
。应该是
List<string>
。我担心我错过了关于选角如何运作的一些重要信息。

c# linq list csv casting
2个回答
1
投票

您需要转换对象,而不是强制转换它。

File.ReadAllText(Global.migrationList).Split(',')
   .Select(x=> Convert.ToInt32(x)).ToList();

强制转换与转换的不同之处在于,字符串值是字符串,而不是 CLR 所关注的数字。如果被投射的对象是

float
decimal
double
或任何数字类型,那么投射就可以正常工作。但由于该对象是
string
,CLR 无法强制转换该对象。但是,您可以将
string
转换为
integer
,它实际上会解析对象并返回一个新对象,而不仅仅是转换其 CLR 类型。

虽然您可能认为转换和转换在实际用途中非常相似,但它们与 CLR 非常不同


1
投票

您无法对可枚举的字符串执行

Cast<int>()
,其原因与您无法执行
(int)"123"
的原因相同 -
string
int
之间不存在此类隐式或显式转换运算符。1

只需使用

Select()
,通过
int.Parse()
传递字符串元素:

Global.migrated = File.ReadAllText(Global.migrationList)
                      .Split(',')
                      .Select(i => int.Parse(i))
                      .ToList();

1 从技术上讲,如果存在这样的用户定义运算符,那么无论如何这里都不会使用它。转换在编译时解析,泛型类型在运行时替换,因此在转换为泛型类型或从泛型类型转换时,不使用用户定义的转换运算符(除非涉及约束,因为存在一定量的信息在这种情况下,可以在编译时推导出来)。但我离题了。

© www.soinside.com 2019 - 2024. All rights reserved.