【问题标题】:Convert text file to List<int>将文本文件转换为 List<int>
【发布时间】:2013-08-19 09:14:39
【问题描述】:

我有一个 ID 号的 CSV 文件,我需要它作为 IEnumberable&lt;int&gt;。我试图尽可能简单地从 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&lt;int&gt;。它应该是List&lt;string&gt;。恐怕我错过了有关铸造工作原理的重要信息。

【问题讨论】:

  • Cast&lt;T&gt; 返回IEnumerable&lt;T&gt;。您需要使用ToList() 扩展方法转换为列表。

标签: c# linq list csv casting


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    转换与转换的不同之处在于字符串值是字符串,而不是 CLR 所关心的数字。如果要转换的对象是floatdecimaldouble 或任何数字类型,那么转换就可以正常工作。但由于对象是string,CLR 无法转换该对象。但是,您可以将 string 转换为 integer,这实际上会解析对象并返回一个新对象,而不仅仅是转换其 CLR 类型。

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

    【讨论】:

    • 装箱拆箱问题?
    • @JP_medevice 不,这里没有装箱或拆箱。
    • 那么 Convert.ToInt32 的确切目标是什么?那些用来转换保存的字符串?
    • @JP_medevice Convert.ToInt32() 有一个 string 重载,所以这就是将要使用的重载。但是,即使使用了object 重载,字符串也是引用(而不是值),因此不会发生装箱。仅当您将值(派生System.ValueType)转换为引用时才会发生装箱,如object x = 1;。这不会发生在这里。
    • 谢谢,瑞恩!效果很好!
    猜你喜欢
    • 1970-01-01
    • 2018-04-28
    • 2013-01-01
    • 1970-01-01
    • 2020-03-13
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多