这是代码。这很简单。
var text = "abcdef";
var c1 = text.Cast<int>().ToArray(); // either this one
var c2 = text.ToCharArray().Cast<int>().ToArray(); // or this one
在任何一种情况下都会引发无效的强制转换异常。为什么呢?
对于奖励分数,如果不是这样的话,最明智的做法是什么?
所以,代码我实际上会写这个:
var c3 = text.Select(c=>(int)c).ToArray();
哪种方法正常。
答案 0 :(得分:5)
查看source code of Cast
。当您使用Cast
时,您将集合作为object
的数组进行迭代,然后将其转换为desidered类型。因此,您发布的代码的生成代码(对于Cast
部分)是:
foreach (object item in text)
{
yield return (int)item;
}
当然,这会产生一个例外here(Rawling在评论中提供的链接,谢谢)。
要重现这一点,您可以尝试使用此代码(您将收到相同的错误):
var myChar = 'c';
object myObject = myChar;
int myInt = (int)myObject; // Exception here
免责声明:仅根据给定的示例进行测试,当然真的很慢。)
您可以使用Cast
制作自己的Convert.ChangeType
方法。
public static class IEnumerableExtensions
{
public static IEnumerable<TResult> MyCast<TResult>(this IEnumerable source)
{
var type = typeof(TResult);
foreach (var item in source)
{
yield return (TResult)Convert.ChangeType(item, type);
}
}
}
然后您可以像使用Cast
一样使用它。
var c1 = text.MyCast<int>();
答案 1 :(得分:1)
我无法找到记录的位置,但LINQ的Cast
uses a cast via object
,基本上是
int i = (int)(object)c;
字符串中的每个字符。
框 char
,然后尝试将取消装箱作为int
,isn't possible。
答案 2 :(得分:0)
var text = "abcdef";
var intText = text.Select(c => (int)c);
您可以从int
的形式将每个字符转换为IEnumerable
开始。