我有一个ID号的CSV文件,我需要IEnumberable<int>
。我试图尽可能简单地从A到B,并想出了以下想法:
Global.migrated = File.ReadAllText(Global.migrationList).Split(',').Cast<int>().ToList<int>();
但是,当我执行此操作时,我被告知Cast无效。我也尝试读取String列表并转换为int:
List<string> myTemp = File.ReadAllText(Global.migrationList).Split(',').ToList<string>();
Global.migrated = myTemp.Cast<int>();
但这会引发以下错误:
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<int>' to 'System.Collections.List<int>.' An explicit conversion exists. Are you missing a cast?
我不明白。在这种情况下,我正在尝试投射的对象不是IEnumerable<int>
。它应该是List<string>
。我担心我错过了关于铸造工作的重要事项。
答案 0 :(得分:1)
您需要转换对象,而不是转换它。
File.ReadAllText(Global.migrationList).Split(',')
.Select(x=> Convert.ToInt32(x)).ToList();
转换与转换不同,字符串值是字符串,而不是CLR所涉及的数字。如果正在投射的对象是float
,decimal
,double
或任何数字类型,那么强制转换就可以了。但由于对象是string
,CLR无法转换对象。但是,您可以将string
转换为integer
,它实际解析对象并返回一个新对象,而不仅仅是转换其CLR类型。
虽然您可能会认为在实际使用中铸造和转换非常相似,但它们与CLR完全不同
答案 1 :(得分: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 从技术上讲,如果有这样一个用户定义的运算符,那么无论如何都不会在这里使用它。在编译时解析转换,并在运行时替换泛型类型,因此在向通用类型转换或从通用类型转换时不使用用户定义的转换运算符(当涉及约束时,可能除外)在这种情况下,可以在编译时推断出一定数量的信息。但我离题了。