0

我有一个 ID 号的 CSV 文件,我需要它作为IEnumberable<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>();

但这会引发以下错误:

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>. 恐怕我错过了有关铸造工作原理的重要信息。

4

2 回答 2

1

您需要转换对象,而不是投射它。

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

转换与转换的不同之处在于字符串值是字符串,而不是 CLR 所关心的数字。如果要转换的对象是float,或任何数字类型,则转换可以正常工作decimaldouble但是由于对象是一个stringCLR 没有办法强制转换对象。但是,您可以将 a 转换为string实际integer解析对象并返回新对象的 a,而不仅仅是转换其 CLR 类型。

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

于 2013-08-16T21:15:38.080 回答
1

您不能Cast<int>()对可枚举的字符串进行操作,原因与您不能做的相同——在and(int)"123"之间没有这样的隐式或显式转换运算符。1stringint

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

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

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

于 2013-08-16T21:16:01.933 回答