将文本文件转换为List

我有一个ID号的CSV文件,我需要它作为IEnumberable 。 我试图尽可能简单地从A到B,并想出了以下想法:

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

但是当我运行它时,我被告知Cast无效。 我也尝试读取String列表并转换为int:

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

但是这会引发以下错误:

 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.List.' An explicit conversion exists. Are you missing a cast? 

我不明白。 在这种情况下,我试图强制转换的对象不是IEnumerable 。 它应该是List 。 我担心我错过了一些关于铸造如何工作的重要信息。

你需要转换对象,而不是转换它。

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

转换与转换不同,字符串值是字符串,而不是CLR所涉及的数字。 如果正在转换的对象是floatdecimaldouble精度或任何数字类型,则转换将正常工作。 但由于对象是一个string ,CLR无法强制转换对象。 但是,您可以将string转换为实际解析对象并返回新对象而不仅仅转换其CLR类型的integer

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

你不能对可枚举的字符串执行Cast() ,原因与你不能做的相同(int)"123" – 在stringint之间没有这样的隐式或显式转换运算符。 1

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

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

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