尝试在 C# 中迭代​​ IEnumerable<int> 时,指定的强制转换无效

Posted

技术标签:

【中文标题】尝试在 C# 中迭代​​ IEnumerable<int> 时,指定的强制转换无效【英文标题】:Specified cast is not valid when trying to iterate through an IEnumerable<int> in C# 【发布时间】:2020-09-25 18:51:34 【问题描述】:

所以我目前正在学习 C# 中的 LINQ,并且我正在尝试这种 Cast&lt;&gt; 扩展方法,它似乎并没有真正奏效。当我尝试遍历 IEnumerable&lt;int&gt; 值时,它不起作用,它给了我错误:

System.InvalidCastException("指定的强制转换无效")。

这是代码: (我也尝试使用ToArray() 将“结果”变量转换为数组,但不管我尝试了什么,它仍然不起作用)

List<string> strings = new List<string>() "1", "2", "3", "4", "5", "6", "7", "8", "9", "10 ;
IEnumerable<int> result = strings.Cast<int>();

foreach(int number in result)
    Console.WriteLine(number);


Console.ReadKey();

在尝试遍历 IEnumerable 结果变量时,我也尝试使用“var”而不是“int”,但仍然无法解决,这是它向我展示的图像:

【问题讨论】:

你不能将字符串转换成整数,你需要转换值,使用 Select 代替。 强制转换与转换不同(尽管在某些情况下强制转换会导致转换)。我建议您搜索如何将字符串转换为 int。 那为什么 Cast 存在呢?不应该将 IEnumerable 中的每个值都转换为给定的 值吗? @DavidGugea 请检查此链接:***.com/questions/6201306/…。它回答了你的问题吗? 【参考方案1】:

您应该改用int.TryParse。所以你可以这样实现强制转换:

strings
    .Select(x => int.TryParse(x, out var result) ? result : 0)
    .ToArray()

strings
    .Select(x => int.TryParse(x, out var result) ? result : throw new InvalidCastException(message: ""))
    .ToArray()

【讨论】:

【参考方案2】:

Cast 不适用于值类型转换,不能使用 Cast 将 string 转换为 int,该方法用于转换一些不实现 IEnumerable 的数组类型,例如数组列表。这样您就不能将 LINQ 与 ArrayList 一起使用。如果要使用LINQ语法查询ArrayList,可以使用Cast将ArrayList转换为Enumerable,则LINQ查询可用。 请参考official document

【讨论】:

以上是关于尝试在 C# 中迭代​​ IEnumerable<int> 时,指定的强制转换无效的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出-探究C#中的IEnumerableIEnumeratorYield

C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效

C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效

如何在 C# 中使用 yield

从C#走进Python迭代器

C# IEnumerable,IEnumerator 重置函数未被调用