尝试在 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<>
扩展方法,它似乎并没有真正奏效。当我尝试遍历 IEnumerable<int>
值时,它不起作用,它给了我错误:
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 中的每个值都转换为给定的您应该改用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时,在循环内修改变量的值无效